shiro缓存机实例代码

2019-01-16 23:10:43于丽

因为测试用例的关系,需要将Ehcache的CacheManager改为使用VM单例模式:

this.manager = new net.sf.ehcache.CacheManager(getCacheManagerConfigFileInputStream());

改为

this.manager = net.sf.ehcache.CacheManager.create(getCacheManagerConfigFileInputStream());

测试用例 

Java代码  

@Test public void testClearCachedAuthenticationInfo() { login(u1.getUsername(), password); userService.changePassword(u1.getId(), password + "1"); RealmSecurityManager securityManager = (RealmSecurityManager) SecurityUtils.getSecurityManager(); UserRealm userRealm = (UserRealm) securityManager.getRealms().iterator().next(); userRealm.clearCachedAuthenticationInfo(subject().getPrincipals()); login(u1.getUsername(), password + "1"); }

首先登录成功(此时会缓存相应的AuthenticationInfo),然后修改密码;此时密码就变了;接着需要调用Realm的clearCachedAuthenticationInfo方法清空之前缓存的AuthenticationInfo;否则下次登录时还会获取到修改密码之前的那个AuthenticationInfo;

Java代码  

@Test public void testClearCachedAuthorizationInfo() { login(u1.getUsername(), password); subject().checkRole(r1.getRole()); userService.correlationRoles(u1.getId(), r2.getId()); RealmSecurityManager securityManager = (RealmSecurityManager) SecurityUtils.getSecurityManager(); UserRealm userRealm = (UserRealm)securityManager.getRealms().iterator().next(); userRealm.clearCachedAuthorizationInfo(subject().getPrincipals()); subject().checkRole(r2.getRole()); }

和之前的用例差不多;此处调用Realm的clearCachedAuthorizationInfo清空之前缓存的AuthorizationInfo; 

另外还有clearCache,其同时调用clearCachedAuthenticationInfo和clearCachedAuthorizationInfo,清空AuthenticationInfo和AuthorizationInfo。 

UserRealm还提供了clearAllCachedAuthorizationInfo、clearAllCachedAuthenticationInfo、clearAllCache,用于清空整个缓存。

在某些清空下这种方式可能不是最好的选择,可以考虑直接废弃Shiro的缓存,然后自己通过如AOP机制实现自己的缓存;可以参考:

https://github.com/zhangkaitao/es/tree/master/web/src/main/java/com/sishuok/es/extra/aop

另外如果和Spring集成时可以考虑直接使用Spring的Cache抽象,可以考虑使用SpringCacheManagerWrapper,其对Spring Cache进行了包装,转换为Shiro的CacheManager实现:

https://github.com/zhangkaitao/es/blob/master/web/src/main/java/org/apache/shiro/cache/spring/SpringCacheManagerWrapper.java  

Session缓存

当我们设置了SecurityManager的CacheManager时,如:

Java代码  

securityManager.cacheManager=$cacheManager