2011-11-16 51 views
3

关于如何使用jsp标签,aop,注释,应用程序上下文以及所有这些类型的东西有很多文档......但是如何直接访问访问控制方法?我需要创建什么课程?有我需要注意的隐藏的bean吗?它似乎并不像SecurityContextHolder是正确的地方看看。Spring Security - 如何直接调用访问控制方法?

我希望做的是这样的:

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

甚至更​​好:

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

谢谢!

编辑:好像春天的安全的人使用授予的权限,用户对象本身:

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

我认为这很可能是有帮助的,如果他们中抽象出一吨这段代码并将其放入一组不错的类中 - 标签库和实际用户都可以使用。毕竟他们是私人助手方法......他们应该可能存在于某些类中的普通气味。

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

回答

2

我能想到的是手动调用您的UserDetailsService,号召返回AuthenticationgetAuthorities(),然后调用返回的集合或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"); 

编写自己的helper方法做到这一点不会太硬,虽然我同意让他们在API中就好了。

+1

是的,这是我的想法。我自己也一直在做这方面的工作。我会给你复选标记,因为这似乎是唯一的答案。这很遗憾,因为jsp标签中有很多代码,我强调这些代码很可能在框架的许多位置进行了编码,并且可能应该放入框架和人们使用的某些标准类中。真的错过了一个机会。 – egervari

相关问题