Spring Security应用开发(15)层次化角色体系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security应用开发(15)层次化角色体系相关的知识,希望对你有一定的参考价值。

1.1. 层次化角色体系

使用Spring Security的层次化角色体系,可以简化复杂角色的配置。配置过程如下:

(1)首先需要在http结点中指定访问决策管理器。

<!-- 角色和URL模式的对应关系
 access-decision-manager-ref:指定使用的访问决策管理器。
 -->
 <sec:http auto-config="true" use-expressions="true"
   access-decision-manager-ref="acceessDecisionManager"
  >

 <sec:intercept-url pattern="/admin/**" access="hasRole(‘ROLE_ADMIN‘)" />
 <sec:intercept-url pattern="/user/**" access="hasRole(‘ROLE_USER‘)" />
 <sec:intercept-url pattern="/home/**" access="hasRole(‘ROLE_USER‘) or hasRole(‘ROLE_ADMIN‘)" /> 

 </sec:http>

 

(2)指定用户和角色的对应关系。

指定 super用户拥有ROLE_SUPER角色,要求此用户在拥有ROLE_SUPER角色之后同时拥有ROLE_ADMINROLE_USER的角色。

<!-- 用户和角色的对应关系 -->
 <sec:authentication-manager >
   <sec:authentication-provider>
     <sec:user-service>
      <sec:user name="zhangsan"  password="123456" authorities="ROLE_ADMIN"/>

      <sec:user name="wangwu"  password="123456" authorities="ROLE_USER"/>

      <sec:user name="super"  password="123456" authorities="ROLE_SUPER"/>

     </sec:user-service>

   </sec:authentication-provider>

 </sec:authentication-manager> 

 

 

(3)配置访问决策管理器。

在访问决策管理器中需要指定使用的决策投票器。本文指定了三个投票器,分别是Web表达式投票器,层次化角色投票器和认证投票器。

 

 <!--
 acceessDecisionManager:访问决策管理器。
 构造函数参数中指定所用的访问决策投票器:
 WebExpressionVoter:Web表达式投票器,对hasRole()等等进行评估投票。
 RoleHierarchyVoter:层次化角色投票器。
 AuthenticatedVoter:认证投票器。
  -->
 <beans:bean  id="acceessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">

 <beans:constructor-arg>
    <beans:list>
         <beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter">
               <beans:property name="expressionHandler" ref="webSecurityExpressionHandler"/>
         </beans:bean>

         <beans:bean class="org.springframework.security.access.vote.RoleHierarchyVoter">
               <beans:constructor-arg ref="roleHierarchy"/>
         </beans:bean>

         

         <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/>

    </beans:list>

 </beans:constructor-arg>

 </beans:bean>


 <!-- Web表达式处理器,创建表达式评估上下文。 -->

 <beans:bean id="webSecurityExpressionHandler" name="webSecurityExpressionHandler"

                class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">

        <beans:property name="roleHierarchy" ref="roleHierarchy"/>

    </beans:bean>

    

 

 

(4)配置层次化角色的实现类。

层次化角色的默认实现类主要作用是根据层次化角色的配置建立起角色体系的层次关系。

<!-- 层次化角色的默认实现
  ROLE_SUPER同时拥有ROLE_ADMIN和ROLE_USER两种角色,即拥有它们的全部权限。
 -->

 <beans:bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
 <beans:property name="hierarchy">
 <beans:value>
 ROLE_SUPER > ROLE_ADMIN
 ROLE_SUPER > ROLE_USER
 </beans:value>
 </beans:property>
 </beans:bean>

 

在经过上述配置后,使用super用户登录之后,可以访问/home/user/admin以及/这四种类型的URL。由于super用户拥有ROLE_SUPER角色,而ROLE_SUPER角色在层次化角色关系建立之后,包含了ROLE_ADMINROLE_USER角色。即同时拥有ROLE_ADMINROLE_USER两种角色,可以访问它们能访问的任何URL

 

以上是关于Spring Security应用开发(15)层次化角色体系的主要内容,如果未能解决你的问题,请参考以下文章

Java:Spring security 3 角色层次结构

Spring security @secure 不适用于角色层次结构

Spring Security ACL 层次结构

Spring Webflux Security 中的角色层次结构

如何在 Spring Security 3 和 Spring EL 中使用角色层次结构?

层次树角色的 Spring Security / Java EE 解决方案