Spring Security @RolesAllowed Works但@Secured在Spring 3.2中使用Spring Security 3.1为我提供了AccessDeniedException

时间:2013-06-27 16:33:05

标签: spring spring-mvc spring-security

我遇到的问题是我的@RolesAllowed控制器方法正常工作,但如果我尝试使用@Secured,我会得到一个AccessDeniedException。虽然我更喜欢使用@RolesAllowed Annotation,但我们已经宣布,对于这个项目,我们应该使用@Secured,因为当映射到我们的旧版访问权限时,名称不那么令人困惑。

我的注释配置如下:

<security:global-method-security jsr250-annotations="enabled" secured-annotations="enabled" pre-post-annotations="enabled" />

当我使用用户拥有的@RolesAllowed("COMPANY_SEE_REPORTS")时,它可以正常工作。当我使用@Secured("COMPANY_SEE_REPORTS")时,我得到一个AccessDeniedException。为了确保@RolesAllowed正常工作,我将角色更改为一个不存在的角色,此时@RolesAllowed投掷了。所以我的问题是如何让@Secured正常工作?

1 个答案:

答案 0 :(得分:2)

尝试使用名称以ROLE

结尾的安全角色

From Spring Security Reference

  

的RoleVoter

     

Spring提供的最常用的AccessDecisionVoter   安全性是简单的RoleVoter,它处理配置   属性作为简单的角色名称和投票以授予用户访问权限   被分配了这个角色。

     

如果任何ConfigAttribute以前缀ROLE _开头,它将投票。它   如果有返回的GrantedAuthority,将投票授予访问权限   String表示(通过getAuthority()方法)完全相等   到前缀为ROLE_的一个或多个ConfigAttributes。如果   从ROLE_开始,没有任何ConfigAttribute完全匹配,   RoleVoter将投票拒绝访问。如果没有ConfigAttribute开始   如果是ROLE_,选民将投弃权票。

但您可以修改RoleVoter前缀RoleVoter#setRolePrefix(String rolePrefix)