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