如何允许管理员(具有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>

10-06 05:01