目标:让Shiro整合ehcache,提供缓存realm数据的功能。
1.引入encache配置文件,配置缓存
1 <!-- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> 2 --><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> 3 4 <!-- 磁盘上的缓存的临时目录 ,默认是系统的临时目录,也可以手动指定一个目录--> 5 <diskStore path="java.io.tmpdir"/> 6 <!-- 默认的缓存区域的默认策略 --> 7 <!-- 8 maxElementsInMemory:内存中元素最大存放的个数 9 eternal:缓存的对象是否永生不死。一般都是false。 10 timeToIdleSeconds:发呆的时间,多长时间不用,就干掉,秒 11 timeToLiveSeconds:存活的时间,活够了就干掉,秒 12 maxElementsOnDisk:硬盘上最大存放的元素的个数,如果内存10000个满了,就往硬盘上存。 13 memoryStoreEvictionPolicy:内存中存储和销毁元素的策略:默认使用LRU,解决的是缓存元素满了怎么办。 14 策略有三个:LRU、LFU、FIFO 15 LRU:最少使用被清理,次数 16 LFU:时间,闲置最长的时间 17 FIFO:管道策略,先进先出 18 --> 19 <defaultCache 20 maxElementsInMemory="10000" 21 eternal="false" 22 timeToIdleSeconds="120" 23 timeToLiveSeconds="120" 24 maxElementsOnDisk="10000000" 25 diskExpiryThreadIntervalSeconds="120" 26 memoryStoreEvictionPolicy="LRU"> 27 <persistence strategy="localTempSwap"/> 28 </defaultCache> 29 <!-- Spring整合的菜单缓存 --> 30 <cache name="bos_menu_cache" 31 maxElementsInMemory="10000" 32 eternal="false" 33 timeToIdleSeconds="120" 34 timeToLiveSeconds="120" 35 maxElementsOnDisk="10000000" 36 diskExpiryThreadIntervalSeconds="120" 37 memoryStoreEvictionPolicy="LRU"> 38 <persistence strategy="localTempSwap"/> 39 </cache> 40 <!-- Shiro权限缓存-认证 --> 41 <cache name="bos_realm_authentication_cache" 42 maxElementsInMemory="10000" 43 eternal="false" 44 timeToIdleSeconds="120" 45 timeToLiveSeconds="120" 46 maxElementsOnDisk="10000000" 47 diskExpiryThreadIntervalSeconds="120" 48 memoryStoreEvictionPolicy="LRU"> 49 <persistence strategy="localTempSwap"/> 50 </cache> 51 <!-- Shiro权限缓存-授权 --> 52 <cache name="bos_realm_authorization_cache" 53 maxElementsInMemory="10000" 54 eternal="false" 55 timeToIdleSeconds="120" 56 timeToLiveSeconds="120" 57 maxElementsOnDisk="10000000" 58 diskExpiryThreadIntervalSeconds="120" 59 memoryStoreEvictionPolicy="LRU"> 60 <persistence strategy="localTempSwap"/> 61 </cache> 62 </ehcache>
2.引入坐标(其他坐标这里略)
1 <!-- shiro整合ehcache --> 2 <dependency> 3 <groupId>org.apache.shiro</groupId> 4 <artifactId>shiro-ehcache</artifactId> 5 <version>1.3.2</version> 6 </dependency>
3.在Spring中配置shiro缓存
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation=" 5 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <!-- 配置Shiro核心Filter,bean的id必须和过滤器的名字一样 --> 8 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 9 <!-- 安全管理器 --> 10 <property name="securityManager" ref="securityManager" /> 11 <!-- 未认证,跳转到哪个页面 ,如果认证失败,跳转的默认页面 --> 12 <property name="loginUrl" value="/login.html" /> 13 <!-- 登录页面页面,如果认证成功,则默认跳转的页面 --> 14 <property name="successUrl" value="/index.html" /> 15 <!-- 如果没有授权,则默认跳转到该页面 --> 16 <property name="unauthorizedUrl" value="/unauthorized.html" /> 17 <!-- shiro URL控制过滤器规则:配置的小过滤器链(过滤器栈):执行从上倒下有顺序 --> 18 <property name="filterChainDefinitions"> 19 <value> 20 /login.html* = anon 21 /user_login.action* = anon 22 /validatecode.jsp* = anon 23 /css/** = anon 24 /js/** = anon 25 /images/** = anon 26 /services/** = anon 27 /pages/base/courier.html* = perms[courier:list] 28 /pages/base/area.html* = roles[base] 29 /** = authc 30 </value> 31 </property> 32 </bean> 33 34 <!-- 安全管理器 --> 35 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 36 <property name="realm" ref="bosRealm"></property> 37 <!-- 开启Shiro缓存功能,需要在shiro安全管理器中注入shiro的 平台缓存管理器 --> 38 <property name="cacheManager" ref="shiroCacheManager" /> 39 </bean> 40 41 <!-- 配置Shiro的bean后处理器:用来初始化Shiro的bean在spring中--> 42 <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> 43 <!-- 开启Shiro注解 --> 44 <!-- Enable Shiro Annotations for Spring-configured beans. 45 Only run after --> 46 <!-- the lifecycleBeanProcessor has run: 47 depends-on:当前bean初始化时,必须依赖于指定的bean,(指定的 48 bean必须先初始化) 49 下面的两个bean配置:传统的aop编程:增强、切点、切面 50 --> 51 <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" 52 depends-on="lifecycleBeanPostProcessor"/> 53 54 <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> 55 <!-- 必须注入安全管理器 --> 56 <property name="securityManager" ref="securityManager" /> 57 </bean> 58 59 <!-- shiro整合echcache的缓存配置 --> 60 <!-- 配置Shiro的平台缓存管理 --> 61 <bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> 62 <!-- 注入ehcache的对象 --> 63 <property name="cacheManager" ref="ehCacheManager" /> 64 </bean> 65 66 </beans>
4.在reaml对象中指定缓存权限的数据的区域
1 @Component("bosRealm") 2 public class BosRealm extends AuthorizingRealm{ 3 4 //只需要向父类注入缓存区域即可 5 //认证缓存区域 6 @Value("bos_realm_authentication_cache") 7 //方法上注入按照参数注入,和方法名无关 8 public void setSuperAuthenticationCacheName(String authenticationCacheName){ 9 super.setAuthenticationCacheName(authenticationCacheName); 10 } 11 //授权缓存区域 12 @Value("bos_realm_authorization_cache") 13 public void setSuperAuthorizationCacheName(String authorizationCacheName){ 14 super.setAuthorizationCacheName(authorizationCacheName); 15 }