4

如何允许管理员(具有角色 ROLE_ADMIN 的用户)访问所有内容,而无需在每个表达式中明确提及他?目前我将控制器的方法注释为

@PreAuthorize("(hasRole('ROLE_VENDOR') and hasPermission(#product, 'admin')) or hasRole('ROLE_ADMIN')")

但我想让它像这样简单,同时允许管理员做任何事情:

@PreAuthorize("hasRole('ROLE_VENDOR') and hasPermission(#product, 'admin')")

可能吗?我怎么做?重要的是要注意 hasPermission(#product, ...) 对于管理员被评估为 false。

4

3 回答 3

2

使用分层角色。

这是一个典型的配置:

<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>

参考

编辑

您可能还需要编写自定义PermissionEvaluator。如果您还没有:只需扩展AclPermissionEvaluator并仅覆盖以在用户拥有角色hasPermission后立即返回 true ;admin否则返回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>
于 2013-10-01T20:04:55.057 回答
1

授予管理员所有必要的角色或使用此处描述的分层角色。

于 2013-10-01T19:56:24.450 回答
1

在安全配置中试试这个

<http use-expressions="true">
    // your security patterns
    <intercept-url pattern="/**" access="hasRole('admin')" />

</http>

如果您将此模式放在列表的末尾,在检查所有规则并且在末尾不匹配任何模式之后,spring 将允许admin在实际上等于任何控制器的任何地址上发送请求

于 2013-10-01T19:58:13.617 回答