Spring Security - 如何直接调用访问控制方法?

时间:2011-11-16 15:56:29

标签: java spring-security authorization

有很多关于如何使用jsp标签,aop,注释,应用程序上下文以及所有这些内容的文档......但是如何直接访问访问控制方法?如果有的话,我需要创建哪个类?我需要注意隐藏的豆子吗? SecurityContextHolder似乎不适合观看。

我想做的是这样的事情:

if(springSecurityObject.isAuthorized("hasAnyRole('DIRECTOR', 'ADMIN')")) {
    // ... do something
}

甚至更好:

if(springSecurityObject.hasAnyRole('DIRECTOR', 'ADMIN')) {
    // ... do something
}

谢谢!

编辑:看起来Spring安全人员正在使用用户对象本身的授权权限:

https://fisheye.springsource.org/browse/spring-security/taglibs/src/main/java/org/springframework/security/taglibs/authz/AbstractAuthorizeTag.java?r=fc399af136492c6c37cdddca6d44e5fe57f69680

我认为,如果他们抽出大量的代码并将其放入一组很好的类中,这可能会有所帮助 - 这是标记库和实际用户都可以使用的。毕竟它们是私人助手方法......一种常见的气味,它们可能应该存在于某些类中。

由于他们手动进行管道工作,我想我必须假设我想要的东西不存在。

1 个答案:

答案 0 :(得分:2)

我唯一能想到的是手动调用UserDetailsService,在返回的getAuthorities()上调用Authentication,然后调用contains()containsAll()返回集合。

所以你有类似的东西:

final UserDetails jimmyDetails = myDetailsService.loadUserByUsername("Jimmy");
final Collection<GrantedAuthority> jimmyAuthorities = jimmyDetails.getAuthorities();

// make it a Collection<String> by iterating and calling .getAuthority()

plainAuthorities.contains("ROLE_YOU_NEED_TO_CHECK_FOR");

编写自己的辅助方法可以做到这一点并不会太难,尽管我同意在API中使用它们会很好。