標籤:
shiro的可以許可權控制內容包括:URL地址、Web頁面的元素、以及方法,即shiro對使用者權限的控制是細粒度的。從使用者的一次訪問來說,他可能需要最多經過三種、多次的驗證。這裡的多次怎麼說呢?如果說Web頁面的有10個元素加了Shiro標籤,則一個頁面的載入就需要10次驗證。一句話:Shiro驗證使用者權限的頻率很高,即訪問資料庫取得使用者權限資訊的頻率很高。同時,使用者的許可權資訊,是基本穩定的。很明顯,這樣的情景需要——緩衝。
shiro對緩衝的支援 shiro並沒有實現緩衝的功能,shiro的緩衝支援只是一個抽象的API。這個抽象是基於從多緩衝機制的產品之上的。換句話說,shiro可以“坐擁三千妃子”啊。下面是《Apache Shiro 1.2.x 使用者指南》 中文翻譯中的內容:
Shiro 有三個重要的緩衝介面:
- CacheManager - 負責所有緩衝的主要管理組件,它返回 Cache 執行個體。
- Cache - 維護key/value 對。
- CacheManagerAware - 通過想要接收和使用 CacheManager 執行個體的組件來實現。
CacheManager 返回Cache 執行個體,各種不同的Shiro 組件使用這些Cache 執行個體來緩衝必要的資料。任何實現了 CacheManagerAware 的 Shiro 組件將會自動地接收一個配置好的 CacheManager,該 CacheManager 能夠用來擷取 Cache 執行個體。
緩衝的配置(spring mvc) shiro的緩衝配置非常簡單,如下:
- 在application-shiro.xml(shiro的設定檔):
<span style="font-family:FangSong_GB2312;"><!-- shiro的緩衝管理器,然後需要將緩衝管理器注入 到安全管理其中 --><bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <!--classpath是緩衝屬性的設定檔 --><property name="cacheManagerConfigFile" value="classpath:config/ehcache-shiro.xml" /></bean></span>
<span style="font-family:FangSong_GB2312;"><!-- shiro管理中心類 start--> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="shiroRealm"></property> <property name="subjectFactory" ref="casSubjectFactory"></property> <!--注入緩衝管理器 --> <property name="cacheManager" ref="shiroEhcacheManager"></property></bean></span>
<span style="font-family:FangSong_GB2312;"><ehcache updateCheck="false" name="shiroCache"> <defaultCache <!--最大緩衝數量 --> maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" /></ehcache></span>
shiro使用緩衝遇到的問題 shiro使用緩衝極大的提高了程式的反應速度,但是對於新手來說,很容易碰到兩個問題。
第一個:
現象:退出登入後,再次訪問程式無需重新登入。
原因:退出登入時,沒有清理緩衝。
第二個:
現象:改變使用者權限時,不能及時反映出來,需要重新登陸才可以。
原因:改變使用者權限是,緩衝中的資料還是原來的許可權資訊。
對於第一個問題:上網查的一些資料,大部分建議改造一下realm的自訂實現,重寫一下退出的緩衝處理方法。對於新手來說,這可能不太好理解。那麼這裡推薦一種簡單的方式:過濾退出地址,交給shiro的logout過濾器處理。logout會調用subject.logout()方法,清理掉shiro的緩衝。只要簡單的在過濾器鏈中加入對退出地址的過濾就好了,配置如下:
<span style="font-family:FangSong_GB2312;"><!-- 過濾器鏈,請求url對應的過濾器 --> <property name="filterChainDefinitions"> <value> /message.jsp=anon <!-- 退出地址,交給logout過濾器處理 --> /logout=logout /shiro-cas=casFilter /** =user </value> </property></span>
對於第二個問題,也就說如何解決緩衝同步。目前我自己還沒有好的解決方案,有知道的麻煩,教教我。這裡,我只能是粗暴的選擇,不使用緩衝。網上有解決方案,我還需要研究研究。
叢集緩衝 這次的項目,實際上我需要用到的是叢集緩衝。所以對於上面的第二個問題,還沒有去深入。但是,叢集緩衝這塊也還沒有弄懂。所以,下篇再介紹了。
Apache shiro(4)-緩衝