繁体   English   中英

如何在 Spring Security 中允许任何其他角色?

[英]How to allow any other role in Spring Security?

你将如何做一个表达式来允许访问所有角色,除非一个角色,而不是在 spring-security.xml 中声明它们?

我们有四个角色: privateuser1user2user3 private是唯一可以执行某些服务的角色。 另一个只允许user1user2user3

<http pattern="/priv/**">
    <intercept-url pattern="/**" access="hasRole('private')"/>
    <http-basic/>
</http>

<http pattern="/pub/**">
    <intercept-url pattern="/**" access="!hasRole('private')"/>
    <http-basic/>
</http>

我知道这样问题就解决了,但是例如在用户具有privateuser2的情况下,该用户应该可以执行/priv//pub/操作。 如何配置xml? 如果用户有两个角色( private角色和其他角色之一),则这两种操作都将被允许。

您可以利用RoleHierarchy来简化您的安全配置。

<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_PRIVATE > ROLE_USER
            ROLE_USER > ROLE_USER1 > ROLE_USER2 > ROLE_USER3
        </value>
    </property>
</bean>

然后在您的http配置中:

<http pattern="/priv/**">
            <intercept-url pattern="/**" access="hasRole('PRIVATE')"/>
            <http-basic/>
 </http>

<http pattern="/pub/**">
            <intercept-url pattern="/**" access="hasRole('USER')"/>
            <http-basic/>
 </http>

这样,您的ROLE_USER将“嵌入”所有其他ROLE_USERX规则,而ROLE_PRIVATE将从ROLE_PRIVATE嵌入所有ROLE_USER

您还应该参考Spring Security Reference

您可以使用boolean hasAnyRoleExcept(String... ignoredRoles)方法实现WebSecurityExpressionRoot的扩展


草图(在没有 IDE 支持的情况下编写)

import org.springframework.security.core.authority.AuthorityUtils;

public class MyWebSecurityExpressionRoot extends WebSecurityExpressionRoot {

   public MyWebSecurityExpressionRoot(final Authentication a, final FilterInvocation fi) {
      super(a, fi);
   }

   public boolean hasAnyRoleExcept(String... ignoredRoles) {
        //see SecurityExpressionRoot.hasAnyRole
        Set<String> roles = 
            AuthorityUtils.authorityListToSet(
               getAuthentication().getAuthorities());

        //find a not ignored role
        for (String role : roles) {
            if (!ignoredRoles.contains(role)) {
                return true;
            }
        }

        return false;
   }
}

要注册它:

public class MyWebSecurityExpressionHandler extends DefaultWebSecurityExpressionHandler {

    //Attention: override setTrustResolver too.
    private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();

    @Override
    protected SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, FilterInvocation fi) {
        MyWebSecurityExpressionRoot root = new MyWebSecurityExpressionRoot(authentication, fi);
        root.setPermissionEvaluator(getPermissionEvaluator());
        root.setTrustResolver(trustResolver);
        root.setRoleHierarchy(getRoleHierarchy());
        return root;
    }
}
<security:http use-expressions="true" ...>
    ...

    <security:expression-handler ref="myWebSecurityExpressionHandler"/>
</security:http>

<bean id="myWebSecurityExpressionHandler" class="MyWebSecurityExpressionHandler"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM