概述
nShiro開發(fā)團隊明白在許多應用程序中性能是至關重要的。Caching 是Shiro 中的一個重要功能,以確保安全操作保持盡可能的快。
n
n但是,Shiro并不實現(xiàn)緩存的功能,Shiro 的緩存支持基本上是一個抽象的(包裝)API,它將“坐”在一個基本的緩存機制產(chǎn)品(例如,Ehcache,OSCache,Terracotta,Coherence,GigaSpaces,JBossCache 等)之上。這允許Shiro終端用戶配置他們喜歡的任何緩存機制。
Caching API
nShiro 有三個重要的緩存接口:
1:CacheManager - 負責所有緩存的主要管理組件,它返回Cache 實例 2:Cache - 維護key/value 對 3:CacheManagerAware - 通過想要接收和使用CacheManager 實例的組件來實現(xiàn)
n
nCacheManager 返回Cache 實例,各種不同的Shiro 組件使用這些Cache 實例來緩存必要的數(shù)據(jù)。任何實現(xiàn)了CacheManagerAware 的Shiro 組件將會自動地接收一個配置好的CacheManager,該CacheManager 能夠用來獲取Cache 實例。
n
nShiro 的SecurityManager 實現(xiàn)及所有AuthorizingRealm實現(xiàn)都實現(xiàn)了CacheManagerAware
n
nShiro 提供了一個個立即可用的EhCacheManager 實現(xiàn)
Caching
配置
n通過在SecurityManager上設置了CacheManger,它反過來也會將它設置到實現(xiàn)了CacheManagerAware 的各種不同的Realm 上,示例如下:
n
cacheManager = org.apache.shiro.cache.ehcache.EhcacheManager securityManager.cacheManager = $cacheManager
n默認的EHCache使用一個Shiro特定的ehcache.xml文件來配置,大致內(nèi)容如下:
<cache name="shiro-activeSessionCache" maxElementsInMemory="10000" overflowToDisk="true" eternal="true" timeToLiveSeconds="0" timeToIdleSeconds="0" diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/>
包裝使用其他的Cache框架
n可以通過寫一個類來實現(xiàn)Shiro的CacheManager,在這個類里面包裝使用任何你想要使用的Cache框架,這里以使用Srping的緩存框架為例,參考如下:
public class MyCacheManager implements CacheManager { public <K, V> Cache<K, V> getCache(String name) throws CacheException { org.springframework.cache.Cache springCache = cacheManager.getCache(name); return new SpringCacheWrapper(springCache); } class SpringCacheWrapper implements Cache { private org.springframework.cache.Cache springCache; SpringCacheWrapper(org.springframework.cache.Cache springCache) { this.springCache = springCache; } public Object get(Object key) throws CacheException { Object value = springCache.get(key); if (value instanceof SimpleValueWrapper) { return ((SimpleValueWrapper) value).get(); } return value; } //等等,還有幾個需要實現(xiàn)的方法,都可以使用你要使用的緩存框架去實現(xiàn) } }
緩存數(shù)據(jù)同步更新的解決方案
n使用Shiro的時候,緩存數(shù)據(jù)最大的問題就在于數(shù)據(jù)同步更新。
n因為Shiro只負責驗證部分,如果應用程序修改了人員的權限,那么就需要同步更新到Shiro里面去,也就是要同步Shiro的緩存數(shù)據(jù)。
n
n一個解決方案就是完全廢棄Shiro的緩存機制,自己在應用中控制數(shù)據(jù)的緩存
n
n這里給出另一種簡易可行的方案:
1:如果你使用的Spring,而且是自定義的Realm,那么可以在你的Realm里面添加一個方法來刪除該用戶的緩存數(shù)據(jù),這樣下次shiro在驗證這個用戶的時候,就會重新去獲取數(shù)據(jù),從而實現(xiàn)數(shù)據(jù)的同步 2:由于是自定義的Realm,可以把該對象作為Spring的bean,注入到你的業(yè)務對象中,在需要的時候就可以調(diào)用該方法來刪除shiro的緩存數(shù)據(jù)了
n示例,比如在前面自定義的MyRealm中,添加如下方法,示例如下:
public void removeUserCache(String userId){ SimplePrincipalCollection pc = new SimplePrincipalCollection(); pc.add(userId, super.getName()); super.clearCachedAuthorizationInfo(pc); }
n然后在HelloAnno中進行測試,示例如下:
1:要注入MyRealm,但注意需要使用getter/setter來注入 2:在main方法中,示例如下: public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); HelloAnno t = (HelloAnno)ctx.getBean("helloAnno"); t.login(); t.t();
t.t();
t.getMr().removeUserCache("javass"); t.t(); } |
|
來自: wayne_liberary > 《Shiro》