我正在使用 Spring Security (AKA Acegi) 插件提供的注释。我有注释的控制器动作
@Secured(['ROLE_ADMIN', 'ROLE_USER'])
表明它们应该可供管理员和普通用户使用。但现在我需要指出管理员和未注册用户可以使用的操作。是否可以使用注释来指示没有任何角色的用户,即未注册的用户?
谢谢,唐
我正在使用 Spring Security (AKA Acegi) 插件提供的注释。我有注释的控制器动作
@Secured(['ROLE_ADMIN', 'ROLE_USER'])
表明它们应该可供管理员和普通用户使用。但现在我需要指出管理员和未注册用户可以使用的操作。是否可以使用注释来指示没有任何角色的用户,即未注册的用户?
谢谢,唐
其令牌是 IS_AUTHENTICATED_ANONYMOUSLY,这意味着任何人,无论是否登录。IS_AUTHENTICATED_REMEMBERED 表示任何人使用记住我的 cookie 或通过显式登录登录,IS_AUTHENTICATED_FULLY 表示通过显式登录(不使用 cookie)登录。
如果你用
@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
然后它将允许任何人访问该操作。您可以将这些特殊令牌与角色结合起来,例如允许仅管理员但强制用户名/密码登录,即使用户有您要使用的记住我的 cookie
@Secured(['ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY'])
这是一个要求您未登录或拥有 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 的经过身份验证的用户。