我正在尝试在spring-security中配置安全注释。但我有一个问题-
....
<security:http auto-config="true" use-expressions="true">
....
当我使用时
@Secured("CUSTOM_ACCESS")
public String query();
它不起作用。但我使用
@PreAuthorize("hasRole('CUSTOM_ACCESS')")
public String query();
它正确工作并应用相关角色。这是否意味着@Secured annotations不适用于@PreAuthorize?
我还尝试添加
<security:global-method-security secured-annotations="enabled" />
但这无济于事。
<security:global-method-security pre-post-annotations="enabled" />
上面的配置运行良好。有什么想法吗?
首先,<http>
元素中的use-expressions
设置对方法安全性注释没有影响。这些是使用global-method-security
启用的。
使用
<security:global-method-security pre-post-annotations="enabled" />
将启用CCD_ 4及其相关注释。启用时,安全注释不起作用的原因是没有知道CUSTOM_ACCESS
含义的投票者。在默认设置中,SpringSecurity的RoleVoter
只使用以前缀ROLE_
开头的属性。有关详细信息,请参阅此常见问题解答。
投票者可以用于检查简单角色之外的其他事情,因此他们通常需要某种方式来确定为方法配置的哪些属性适用于他们。基于表达式的注释的操作与标准投票者不同。hasRole
表达式只是查找分配给用户的命名权限。
因此,如果您为方法安全性创建了一个AccessDecisionManager
,其中AccessDecisionVoter
会消耗您的CUSTOM_ACCESS
属性,那么@Secured
注释就会产生效果。然而,既然你已经使用了PostAuthorize
,你可能只想坚持使用它。