shiro權限控制管理

1、shiro權限控制的原理:
    (1)基於(攔截器Filter)url粗粒度的控制
        在數據庫中存放用戶、權限、訪問
url對應的地址,查詢數據庫判斷
用戶當前具有權限,是否包含這個
url,如果包含則允許訪問,如果
不包含則提示權限不足;
 
(2)基於(aop)在方法上添加註解的細粒度控制
       可以代理、自定義註解實現,訪問目標
對象的方法,在方法上添加權限註解
信息,對目標對象創建代理對象,訪問真實
對象先訪問代理對象,在代理對象查詢數據庫
時判斷是否具有註解上描述需要的權限,若具有
權限,則允許訪問,不具有權限,則攔截訪問,
提示權限不足;
2、權限控制相關的數據表
   (1)實體:用戶  角色   權限
   (2)權限:描述權限信息(粗粒度權限控制,可能在權限表描述訪問資源的url信息)
   (3)角色(role):方便用戶進行授權,角色就是權限的集合
   (4)menu菜單:爲了方便進行動態菜單管理,
               爲不同的用戶定製不同的系統菜單,
               不同的用戶系統菜單,可以根據用戶角色進行管理
 
   多對多              多對多
     ①用戶<————————————>角色<——————————————>權限   一共5張表
            

多對多
      ②角色<————————————————>菜單
   3、shiro的使用流程:
    (1)導入maven座標
    
(2)配置web.xml
<!-- shiro security filter -->
<!--Shirofilter-->
    <filter>
   <filter-name>shiroFilter</filter-name>?
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
    </filter>
   <filter-mapping>
   <filter-name>shiroFilter</filter-name>
   <url-pattern>/*</url-pattern>
   </filter-mapping>




(3)配置applicationContext-shiro.xml文件

   <bean id="shiroFilter"
                 class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
 
            <!-- shiro 的核心安全接口 -->
                <property name="securityManager" ref="securityManager" />

            <!-- 要求登錄時的鏈接 -->
                <property name="loginUrl" value="/login.jsp" />

            <!-- 登陸成功後要跳轉的連接 -->
                 <property name="successUrl" value="/index.jsp" />
 
            <!-- 未授權時要跳轉的連接 -->
                 <property name="unauthorizedUrl" value="/unauthorized.jsp" />
 
            <!-- shiro 連接約束配置 -->
                 <propery name="filterChainDefinitions">
                <value>
                   /login = authc
                   /logout = logout
                   /resource/** = anon
                   </value>
                   </property>
            </bean>
            <bean id="securityManager"
                 class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            </bean>
            <bean id="lifecycleBeanPostProcessor"
              class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
       </bean>



anon  未認證就可以訪問
authc  認證後纔可以訪問
perms   需要特定權限纔可以訪問
roles   需要特定角色纔可以訪問
user    需要特定用戶纔可以訪問
port    需要特定端口纔可以訪問
reset   根據特定的http纔可以訪問


(4)根據shiro的執行流程:
應用程序--subject--securityManager---realm---安全數據
     
3、shiro的realm的認證和授權的實現
    


4、配置註解實現業務層方法級別的權限控制

  (1)在applicationContext-shiro.xml文件中配置
    <!-- 開啓shiro註解模式  -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor" >

<!-- 使用cglb代理 -->
<property name="proxyTargetClass" value="true" />
</bean>
 
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
 
 
 (2)基於註解的授權實現 
@ RequiresAuthentication 
     @ RequiresGuest
     @RequiresPermissions("account:create") 
     @RequiresRoles 
     @ RequiresUser 
 
5、shiro權限控制小結:
   (1)URL級別粗粒度權限控制
          ①在web.xml文件的shiroFilter攔截/*
          ②在spring的applicationContext*.xml文件
   中配置同名bean,配置filterChainDefintions攔截
          xxx.html*=anno   未登錄可以訪問
          xxx.html*=authc   必須登錄才能訪問
          xxx.html*=perms[權限] 需要特定權限才能訪問
          xxx.html*=roles[角色] 需要特定角色才能訪問


    (2)在spring的applicationContext.xml中配置
spring aop纔對spring管理bean對象開啓shiro註解支持
   @RequiresPermissions(權限)  需要特定權限纔可以訪問
@RequiresRoles(角色)   需要特定角色纔可以訪問
@requiresAuthentication 需要認證纔可以訪問

    (3)通過shiro自定義標籤,實現頁面元素顯示控制
  <shiro:authenticated> 登錄後才能訪問
  <shiro:hasPermission name="abc"> 需要特定權限才能訪問
  <shiro:hasRole  name="abc" >  需要特定角色纔可以訪問
  
   (4)在程序中通過代碼  判斷用戶是否具有指定權限(不常用,有代碼侵入性,不推薦使用)
 
6、補充:權限表達式   “:”代表子權限
   ①權限: courier  包含courier:add 、 courier:list 、courier:*  
   ②如果用戶具有父權限,則可以操作所有子權限功能

    例如:權限courier:list  包含courier:list:10




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章