Spring Security Grails Acegi安全性:角色和访问问题

ee7vknir  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(102)

我的应用程序有一些奇怪的行为。
我已经在User类(由Acegi创建)中添加了几个字段,因此我可以设置过期密码,记录最后N个密码,诸如此类。我们有9个角色,ROLE_ADMIN是可以访问所有功能的“超级用户”。
部署应用程序后,用户开始抱怨他们无法使用它。他们可以登录,但每当他们想去某个地方时,他们都会被拒绝访问,就像他们没有角色一样。
这会发生在每个用户上,除了管理员(仅具有ROLE_ADMIN),包括具有(ROLE_ADMIN+其他角色)的用户。
我都不知道该从何说起。

更新

我已经检查过了,用户来自数据库,并附加了角色。
在SecurityConfig.groovy文件中检查角色。我担心问题出在其他地方,因为我有一个实际工作的项目的标记版本。
下面是我的安全配置。

import com.mycompany.myapp.audit.Auditoria

security {

    // see DefaultSecurityConfig.groovy for all settable/overridable properties

    active = true

    loginUserDomainClass = "com.mycompany.myapp.user.User"
    authorityDomainClass = "com.mycompany.myapp.user.Role"
    requestMapClass = "com.mycompany.myapp.user.Requestmap"

    useRequestMapDomainClass = false

    /** authenticationEntryPoint */
    loginFormUrl = '/login/auth'
    forceHttps = 'false'
    ajaxLoginFormUrl = '/login/authAjax'
    authenticationFailureUrl = '/login/authfail'
    

    afterLogoutUrl = '/login/auth'

    requestMapString = """\
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
            PATTERN_TYPE_APACHE_ANT

            /=IS_AUTHENTICATED_REMEMBERED
            /login/auth=IS_AUTHENTICATED_ANONYMOUSLY
            /login/authajax=IS_AUTHENTICATED_ANONYMOUSLY
            /login/authfail=IS_AUTHENTICATED_ANONYMOUSLY
            /login/renew=IS_AUTHENTICATED_ANONYMOUSLY
            /js/**=IS_AUTHENTICATED_ANONYMOUSLY
            /css/**=IS_AUTHENTICATED_ANONYMOUSLY
            /images/**=IS_AUTHENTICATED_ANONYMOUSLY
            /plugins/**=IS_AUTHENTICATED_ANONYMOUSLY
           
            
            /scan/uploadfile=IS_AUTHENTICATED_ANONYMOUSLY
            /ticket/uploadfile=IS_AUTHENTICATED_ANONYMOUSLY
            /analisis/list =ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_OP_FUNCIONAL, ROLE_ADMIN
            /analisis/hazzards/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_OP_FUNCIONAL, ROLE_ADMIN
            /analisis/show/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /analisis/create/**=ROLE_SUP_TECNICO, ROLE_ADMIN
            /analisis/edit/**=ROLE_SUP_TECNICO,ROLE_ADMIN
            /hazzardsreport/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_OP_FUNCIONAL, ROLE_REPORTE_VULNERABILIDAD, ROLE_ADMIN
            /mistaken/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /hazzardtype/**=ROLE_SUP_TECNICO, ROLE_ADMIN

            /** MODULO NORMAS */
            /report/**=ROLE_OP_FUNCIONAL, ROLE_ADMIN
            /norm/**=ROLE_OP_FUNCIONAL, ROLE_ADMIN

            /** TICKETS */
            /ticket/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /alert/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /ticket/uploadfile=IS_AUTHENTICATED_ANONYMOUSLY

            /** RISKS */
            /project/**=ROLE_AN_RIESGOS, ROLE_ADMIN
            /riskreport/**=ROLE_AN_RIESGOS, ROLE_ADMIN, ROLE_REPORTE_RIESGO
            
        /** BUSINESS CONTINUITY*/
            /projectpcn/**=ROLE_AN_PCN, ROLE_ADMIN
        /businessuniteval/** = ROLE_AN_PCN, ROLE_ADMIN
        /subprocesseval/** = ROLE_AN_PCN, ROLE_ADMIN
        /failscenario/**=ROLE_AN_PCN, ROLE_ADMIN
        /strategy/**=ROLE_AN_PCN, ROLE_ADMIN
        /test/**=ROLE_AN_PCN, ROLE_ADMIN
        /reportepcn/**=ROLE_AN_PCN, ROLE_ADMIN, ROLE_REPORTE_PCN
        /process/**=ROLE_AN_PCN, ROLE_ADMIN
            
            
        /** ADMIN */
            /user/changeent=IS_AUTHENTICATED_REMEMBERED
            /user/finduser=IS_AUTHENTICATED_REMEMBERED
            /user/**=ROLE_ADMIN
            /role/**=ROLE_ADMIN
            /requestmap/**=ROLE_ADMIN
        /empresa/**=ROLE_ADMIN
        /asset/**=ROLE_ADMIN, ROLE_SUP_TECNICO, ROLE_OP_TECNICO
        /responsable/**=ROLE_ADMIN
        /preference/**=ROLE_ADMIN
        /businessunit/**=ROLE_ADMIN, ROLE_AN_PCN
                    
                    
            /**=IS_AUTHENTICATED_REMEMBERED
        """

    useSecurityEventListener = true
   
    onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
        Auditoria.log(e.getSource().getPrincipal().getDomainClass(), "Usuario autenticado - " + e.getSource().getDetails().getRemoteAddress())
    }

}

字符串

更新-日志详细信息,无注解/换行符

在更新我的SecurityConfig.groovy后,错误仍然存在。但是,我检索了此日志行。我试图使用分配了所有9个角色的用户访问/norm/index
调试2010年12月28日00:12:57,110 [http-8080-3]安全对象:筛选器调用:URL:/规范/索引;配置属性:[角色_操作_功能,角色_管理]
安全性拦截器

  • 先前已验证:用户名密码身份验证令牌@a00c7ad6:主体:com. baufest. insside. security. userLogin详细信息@0:

使用者名称:一些用户;密码:[已保护];已启用:真的;帐户未到期:真的;凭证未过期:真的;帐户未锁定:真的;授权机构:技术人员的角色;用户名:[已保护];已验证:真的;
详细信息:org.springframework.security.ui.WebAuthenticationDetails@0:授权权限:角色_操作_TECNICO
调试时间:2010年12月28日00:12:57,110 [http-8080-3]

  • 访问被拒绝(用户不是匿名的);委托给AccessDeniedHandler

就我在这里读到的内容而言,我的用户似乎只得到了一个角色,即使在我调试它时,user.authorities已经分配了所有9个角色。

解决方案

事实证明,我的Role类(Role实现GrantedAuthority)中的compareTo方法总是返回0。因此,每个用户只有一个角色(因为它们存储在Set中)。

q5iwbnjs

q5iwbnjs1#

编辑-
documentation中,requestMapString的格式应为

requestMapString = '''CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
                      PATTERN_TYPE_APACHE_ANT 
                      /login/**=IS_AUTHENTICATED_ANONYMOUSLY 
                      /admin/**=ROLE_USER
                      /book/test/**=IS_AUTHENTICATED_FULLY
                      /book/**=ROLE_SUPERVISOR
                   '''

字符串
几个注意事项:
1)在请求Map字符串中有额外的换行符和注解。requestMapString是multiline String(看看"“one long string '”"格式),所以Acegi机制将尝试解析/使用注解。

相关问题