以编程方式访问/检查Spring Security分层角色

时间:2012-02-23 21:11:11

标签: grails spring-security

在我的Grails项目中,我使用Spring Security插件定义了多个hierarchical roles,例如ROLE_USER > SOME_OTHER_ROLE。使用@Secured注释保护控制器方法时,它可以正常工作。但是,我还想在一个用例的代码中以编程方式检查角色。使用以下方法,即使用户通过层次结构角色定义继承角色,我总是得到false

request.isUserInRole('SOME_OTHER_ROLE')

以下调用永远不会直接返回继承的角色:

SecurityContextHolder.context?.authentication?.authorities
springSecurityService.getPrincipal().getAuthorities()

有没有办法检查用户是否也有继承角色?

1 个答案:

答案 0 :(得分:2)

这似乎是SecurityContextHolderAwareRequestWrapper中的一个错误(或至少是一个遗漏),它添加了一个请求包装器来实现isUserInRole方法。

您可以使用roleVoter bean的extractAuthorities方法。为其添加依赖注入(def roleVoter),然后调用

def allRoles = roleVoter.extractAuthorities(
        SecurityContextHolder.context.authentication)