將 Shiro 作爲應用的權限基礎 七:緩存Shiro本地會話

 

系統通過AOP切入權限認證後,既想保證安全,也想保證訪問頁面的速度,那就得用到緩存了,或者說是緩衝區。

用戶第一次登陸後,將該用戶所具有的所有權限緩存到本地。這樣,頻繁的驗證用戶是否具有操作權限時,不再每次都到數據庫拿數據。

OA項目中的權限,是每次用戶操作前,先到數據庫中取得該用戶擁有的權限,然後判斷其操作是否合法。這樣的頻繁的讀取數據,必然降低了頁面的訪問速度。

 

緩存配置

雖然Shrio缺省提供了基於ehCache來緩存用戶認證信息和授權信息的實現,還記得EhCache是Hibernate的二級緩存技術之一。但還是提倡顯示配置緩存,因爲一眼就能看出使用了緩存,並且可以設置參數。

 

shiro配置中加入ehCache配置

<!--用戶授權/認證信息Cache, 採用EhCache  緩存 -->
<beanid="shiroEhcacheManager"class="org.apache.shiro.cache.ehcache.EhCacheManager">
<propertyname="cacheManagerConfigFile"value="classpath:ehcache-shiro.xml"/>
</bean>
 
<beanid="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--Single realm app.  If you have multiplerealms, use the 'realms' property instead. -->
<propertyname="realm" ref="shiroDbRealm" />
<propertyname="cacheManager" ref="shiroEhcacheManager" />
</bean>

 

ehCache 配置

<ehcacheupdateCheck="false" name="shiroCache">
    <defaultCache
           maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            diskPersistent="false"
diskSpoolBufferSizeMB="50"
           diskExpiryThreadIntervalSeconds="120"
            />
</ehcache>


maxElementsInMemory:內存允許的最大存儲緩存數,如果超過,在開啓磁盤存儲的情況下,會存入磁盤

eternal:對象是否永久有效

timeToIdleSeconds:對象允許空閒時間(秒),當且僅當eternal=fasle時起效,如果值爲0,表示可閒置時間無窮大

timeToLiveSeconds:對象允許存活時間(秒),當且僅當eternal=fasle時起效,如果值爲0,表示可閒置時間無窮大,配置值應該大於空閒時間值,否則沒有意義

overflowToDisk:內存中緩存數超過最大值之後是否允許存入磁盤

diskSpoolBufferSizeMB:磁盤緩存的緩存區大小

diskPersistent:是否在磁盤上持久化。指重啓jvm後,數據是否有效。默認爲false

 

下面通過這個例子來講解(源碼下載

這是登錄頁面,可以使用admintest登錄,但他們具有不同權限


 

通過admin登陸後,控制檯顯示:

====================doGetAuthenticationInfobegin ==========================

username:admin

password:admin

principal:admin

======================doGetAuthenticationInfoend ========================

 由於加入了緩存,此處只會load一次:doGetAuthorizationInfo.................

 

顯示的信息說明,是使用admin登錄的,而無論admin再做什麼操作,doGetAuthorizationInfo(驗證權限的方法)只執行一次。

 

admin登錄後看到的頁面(test無權限訪問)


 

admin如果沒有logout,又通過test登陸,此時控制檯並沒有打印認證信息,test看到的界面就是剛纔admin看到的界面,也就是具有相同的權限(本來是不同的)。

因爲沒有logoutEhCache緩存shiro會話(包括登陸和權限等信息),sessionId是一樣的,也就不會執行登陸認證(doGetAuthenticationInfo)和授權認證(doGetAuthorizationInfo)

 

所以,緩存及時清理工作很重要。用戶在安全退出和沒有安全退出情況下,都得保證緩存的清理工作。

緩存是把雙刃劍,給帶來高效的同時,也留下了隱患。

 

當用戶沒有安全退出就直接關閉瀏覽器,會話可能在緩存裏孤立,如何解決?敬請期待!

發佈了130 篇原創文章 · 獲贊 433 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章