【问题标题】:Grails Acegi plugin annotationsGrails Acegi 插件注释
【发布时间】:2010-01-26 15:45:02
【问题描述】:

我正在使用 Spring Security (AKA Acegi) 插件提供的注释。我有用

注释的控制器动作
@Secured(['ROLE_ADMIN', 'ROLE_USER'])

表明它们应该可供管理员和普通用户使用。但现在我需要指出管理员和未注册用户可以使用的操作。是否可以使用注释来指示没有任何角色的用户,即未注册的用户?

谢谢, 唐

【问题讨论】:

    标签: security grails spring-security grails-plugin


    【解决方案1】:

    这是一个要求您未登录或拥有 ROLE_ADMIN 的解决方案。您需要一个处理新的“IS_NOT_AUTHENTICATED”令牌的自定义选民:

    package com.burtbeckwith.grails.springsecurity
    
    import org.springframework.security.Authentication
    import org.springframework.security.AuthenticationTrustResolverImpl
    import org.springframework.security.ConfigAttribute
    import org.springframework.security.ConfigAttributeDefinition
    import org.springframework.security.vote.AccessDecisionVoter
    
    class NotLoggedInVoter implements AccessDecisionVoter {
    
       private authenticationTrustResolver = new AuthenticationTrustResolverImpl()
    
       int vote(Authentication authentication, object, ConfigAttributeDefinition config) {
          for (configAttribute in config.configAttributes) {
             if (supports(configAttribute)) {
                if (authenticationTrustResolver.isAnonymous(authentication)) {
                   // allowed if not logged in
                   return ACCESS_GRANTED
                }
                for (authority in authentication.authorities) {
                   if ('ROLE_ADMIN' == authority.authority) {
                      // allowed if logged in as an admin
                      return ACCESS_GRANTED
                   }
                }
             }
          }
    
          return ACCESS_DENIED
       }
    
       boolean supports(ConfigAttribute attribute) {
          'IS_NOT_AUTHENTICATED' == attribute?.attribute
       }
    
       boolean supports(Class clazz) {
          true
       }
    }
    

    在 resources.groovy 中将其注册为 bean:

    beans = {
       notLoggedInVoter(com.burtbeckwith.grails.springsecurity.NotLoggedInVoter)
    }
    

    并通过设置“decisionVoterNames”属性将其添加到 SecurityConfig.groovy 中的投票者列表中:

    decisionVoterNames = ['notLoggedInVoter', 'authenticatedVoter', 'roleVoter']
    

    并使用以下注释您的控制器操作:

    @Secured(['IS_NOT_AUTHENTICATED'])
    

    它只允许未经身份验证的用户和具有 ROLE_ADMIN 的身份验证用户。

    【讨论】:

    • 我认为从设计的角度来看,将 IS_NOT_AUTHENTICATED 的含义从(管理员或未验证)更改为简单(未验证)会更好。大概然后您可以将此令牌与 ROLE_ 令牌的任意组合结合使用。大概可以通过删除NotLoggedInVoter.vote中的最后一个“for”循环来进行此更改@
    • 顺便说一句,干得好,我没想到会有这种程度的帮助。
    【解决方案2】:

    它的令牌是 IS_AUTHENTICATED_ANONYMOUSLY,这意味着任何人,无论是否登录。 IS_AUTHENTICATED_REMEMBERED 表示任何人使用记住我的 cookie 或通过显式登录登录,IS_AUTHENTICATED_FULLY 表示通过显式登录(不使用 cookie)登录。

    如果你用

    注释你的动作
    @Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
    

    然后它将允许任何人访问该操作。您可以将这些特殊令牌与角色结合起来,例如,允许仅管理员权限但强制用户名/密码登录,即使用户有您要使用的记住我的 cookie

    @Secured(['ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY'])
    

    【讨论】:

    • 感谢您的回复。我想用注解表达的是“未登录”,而不是“是否登录”,这可能吗?
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 2015-02-06
    • 2011-01-05
    • 2011-05-28
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多