如何允许管理员(具有ROLE_ADMIN角色的用户)访问所有内容,而无需在每个表达式中明确提及他?目前,我的控制器方法注释为
@PreAuthorize("(hasRole('ROLE_VENDOR') and hasPermission(#product, 'admin')) or hasRole('ROLE_ADMIN')")
但是我想让管理员做任何事情这样简单:
@PreAuthorize("hasRole('ROLE_VENDOR') and hasPermission(#product, 'admin')")
可能吗?我怎么做?需要注意的重要一点是,对于admin,hasPermission(#product,...)的评估为false。
最佳答案
使用分层角色。
这是一个典型的配置:
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
<constructor-arg ref="roleHierarchy" />
</bean>
<bean id="roleHierarchy"
class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<property name="hierarchy">
<value>
ROLE_ADMIN > ROLE_STAFF
ROLE_STAFF > ROLE_USER
ROLE_USER > ROLE_GUEST
</value>
</property>
</bean>
reference
编辑
您可能还需要编写一个自定义PermissionEvaluator。如果您还没有,则:扩展AclPermissionEvaluator并仅覆盖
hasPermission
以在用户具有admin
角色后立即返回true;否则返回super.hasPermission(...)
像这样配置您的bean:
<security:global-method-security pre-post-annotations="enabled">
<security:expression-handler ref="expressionHandler" />
</security:global-method-security>
<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<property name="permissionEvaluator" ref="customPermissionEvaluator" />
...
</bean>