security - Grails Acegi 安全 : Problem with roles and access

标签 security grails spring-security user-roles

这个故事的悲惨结局

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

问题

大家好,

我的应用程序中有一些奇怪的行为。

我在 User 类(由 Acegi 创建)中添加了几个字段,所以我可以设置过期密码,记录最后 N 个密码,诸如此类。我们有 9 个角色,ROLE_ADMIN成为可以访问所有功能的“ super 用户”。

部署应用程序后,用户开始提示他们无法使用它。他们可以登录,但无论何时他们想去某个地方,他们都会被拒绝访问,就好像他们没有角色一样。

这发生在每个用户身上,除了管理员(只有 ROLE_ADMIN ),包括那些( ROLE_ADMIN + 其他角色)。

我什至无法想到要开始。

更新

我已经检查过,用户来自带有附加角色的数据库。

在 SecurityConfig.groovy 文件中检查角色。恐怕问题出在其他地方,因为我有一个实际有效的项目标记版本。

这是我的 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 后,错误继续。
但是,我已经恢复了这个日志行。我尝试访问 /norm/index与分配了所有 9 个角色的用户一起使用。

DEBUG 28/Dec/2010 00:12:57,110 [http-8080-3] Secure object: FilterInvocation: URL: /norm/index; ConfigAttributes: [ROLE_OP_FUNCIONAL,ROLE_ADMIN]

org.springframework.security.intercept.AbstractSecurityInterceptor - Previously Authenticated: org.springframework.security.providers.UsernamePasswordAuthenticationToken@a00c7ad6: Principal: com.baufest.insside.security.UserLoginDetails@0:

Username: someuser; Password:[PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_OP_TECNICO; Password: [PROTECTED]; Authenticated: true;

Details: org.springframework.security.ui.WebAuthenticationDetails@0: Granted Authorities: ROLE_OP_TECNICO

DEBUG 28/Dec/2010 00:12:57,110 [http-8080-3] org.springframework.security.ui.ExceptionTranslationFilter - Access is denied (user is not anonymous); delegating to AccessDeniedHandler



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

任何想法将不胜感激
提前致谢。

最佳答案

编辑 -

来自 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) 请求映射字符串中有额外的换行符和注释。 requestMapString 是 multiline String (查看 '''one long string''' 格式),因此 Acegi 机制将尝试解析/使用注释。

关于security - Grails Acegi 安全 : Problem with roles and access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4520567/

相关文章:

c# - 开发安全应用程序的最佳方法。与.net

MySQL PASSWORD() 函数和 SpringSecurity ShaPasswordEncoder

security - 非 HTTP(S) 连接的透明 SSL/TLS 代理(工具建议)

php - 创建许可系统

mongodb - 与托管Mongodb进行Grails集成测试

grails - 什么是 "coding by convention"?

grails - 如何更新 grails 域对象列表上的属性?

java - Spring security 阻止 css、js 文件加载到 jsp 页面上

java - 如何使用 ShaPasswordEncoder 正确编码密码?

security - 加强 HTTP 流量使其不可重现的想法