shiro學習與應用

jeli007 12年前發布 | 100K 次閱讀 Shiro 安全相關 shiro學習與應用
第一階段:裝配shiro
    shiro這個安全框架的使用,經過自己在項目中的實際應用,確實要比springsecurity要好用得多了...
        附件中的demo只是結合springmvc把登陸驗證部分做了,沒有加任何封裝,非常的原生態,有助于理解shiro工作原理
        另外還有一大功能就是權限的組裝和認證,其實很簡單,只要在shiro的配置文件中關注以下部分:
<property name="filterChainDefinitions">
   <value>
    /login = anon(不用登陸也能訪問)
    /user/** = authc(登陸之后才能訪問)
    /role/edit/* = perms[role:edit]
    /role/save = perms[role:edit]
    /role/list = perms[role:view]
    /** = authc
         </value>
  </property>
        當shiro攔截到<value></value>中預先配好的請求路徑,就會去調用doGetAuthorizationInfo()方法,這是我們需要在此方法中手動添加權限查詢權限語句(可以來自文件系統,也可以來自數據庫),shiro會通過此方法返回的list中的權限列表去匹配此用戶是否具有權限(“role:edit”即為數據庫所存字段的格式),若無:<property name="unauthorizedUrl" value="/nopermission.jsp" />
 
第二階段:權限細化到按鈕級別
    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
      
      <shiro:hasPermission name="user:add"> 
           <li><a href="javascript:" onclick="refresh('user/pre_add_user')">添加運營人員</a></li>
      </shiro:hasPermission>
 
第三階段:shiro的session與權限緩存控制
    登錄認證通過后,存入shiro session中:
        User user=new User(username, password);
        org.apache.shiro.subject.Subject subject = org.apache.shiro.SecurityUtils.getSubject();
        org.apache.shiro.session.Session session = subject.getSession();
        session.getAttribute(user); 
      1.代碼中控制session時間
        session.setTimeout(5000); //過期時間在代碼中設置
        //      Date start = session.getStartTimestamp();
        //      Date timestamp = session.getLastAccessTime(); 
      2.配置文件中控制session時間
             a、shiroFilter中注入securityManager
            <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
                     <property name="securityManager" ref="websecurityManager" />
             </bean>
               b、websecurityManager中注入sessionMode、cacheManager、sessionManager
            <bean id="websecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
                   <!-- 如果用shiro的session,sessionMode要設置成為native -->
                    <property name="sessionMode" value="native" />
                    <property name="cacheManager" ref="shiroCacheManager" />
                    <property name="sessionManager" ref="sessionManager" /> 
             </bean>
             
            配置cache以及注入cache配置文件
             <bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
                   <property name="cacheManagerConfigFile" value="classpath:beans/shiro-cache.xml"/>
            </bean>  
            
            配置sessioncache,此處指明為shiro-activeSessionCache,即可在shiro-cache.xml中對session過期時間等參數進行配置
             <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
                     <property name="sessionDAO" ref="sessionDAO"/>
             </bean>
             <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
                     <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
             </bean>
            
           另附shiro-cache.xml
<ehcache>
 <diskStore path="java.io.tmpdir/tuan-oauth" />
         <defaultCache maxElementsInMemory="10000" 
              eternal="false"
              timeToIdleSeconds="120" 
              timeToLiveSeconds="120" 
              overflowToDisk="false"
              diskPersistent="false" 
              diskExpiryThreadIntervalSeconds="120" />
        
        <!-- sessioncache -->
         <cache name="shiro-activeSessionCache"  
                 maxElementsInMemory="10000"
                 eternal="false" 
                 overflowToDisk="false" 
                 diskPersistent="true"
                 timeToIdleSeconds="120" 
                 timeToLiveSeconds="120" 
                 diskExpiryThreadIntervalSeconds="120" />
 
         <!-- 權限cache,默認命名shiro.authorizationCache -->
        <cache name="shiro.authorizationCache" 
                 maxElementsInMemory="100"
                 eternal="false" 
                 timeToLiveSeconds="120" 
                 overflowToDisk="false" />
</ehcache>
    
 
 第四階段:緩存同步,做到分布式
<!-- 配置PeerProvider -->
 <!-- 手動方式同步sever2中的userCache和resourceCache -->
 <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
  properties="peerDiscovery=manual, rmiUrls=//localhost:8080/userCache|//localhost:8080/userCache" /> -->
 
 <!-- 自動方式同步sever2中的userCache和resourceCache -->
 <!-- <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"  
  properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,  
     multicastGroupPort=4446, timeToLive=32"/> -->
 
 
 <!-- 配置CacheManagerPeerListener 配置中server1監聽本機40001端口 -->
 <!-- <cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
  properties="hostName=127.0.0.0, port=8080,socketTimeoutMillis=2000" />  
 
 
<defaultCache  
  maxElementsInMemory="10000"  
  eternal="false"  
  timeToIdleSeconds="120"  
  timeToLiveSeconds="120"  
  overflowToDisk="true"  
  diskSpoolBufferSizeMB="30"  
  maxElementsOnDisk="10000000"  
  diskPersistent="false"  
  diskExpiryThreadIntervalSeconds="120"  
  memoryStoreEvictionPolicy="LRU"  
  <cacheEventListenerFactory  
  class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>  
  />
 
 
另外shiro默認使用ehcache,也可以用第三方緩存做分布是緩存等等
除此以外,shiro有提供部分實用的標簽,在此不做介紹,網上很多
 本文由用戶 jeli007 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!