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>
<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>
<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時間
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時間
// 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>
<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>
<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>
<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" />
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 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" />
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" />
第四階段:緩存同步,做到分布式
<!-- 配置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"/>
/>
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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!