shiro中提供了对认证和授权的缓存,shiro是默认开始授权缓存而关闭认证缓存的
在SecurityManager中需要这个参数
项目一
项目二
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="customRealm" /> <property name="cacheManager" ref="cacheManager"/> <property name="sessionManager" ref="sessionManager" /> <property name="rememberMeManager" ref="rememberMeManager"/> </bean>可以使用不同的缓存
cacheManager
redis
<bean id="shiroCacheManager" class="com.minstone.common.security.shiro.cache.RedisCacheManager"> <property name="redisManager" ref="redisManager" /> </bean>redisManager 就是一个简单的数据库连接
<bean id="redisManager" class="com.minstone.common.utils.redis.RedisManager"> <property name="jedisPoolConfig" ref="jedisPoolConfig"></property> <property name="host" value="${redis.host}"></property> <property name="port" value="${redis.port}"></property> <property name="timeout" value="${redis.timeout}"></property> <property name="usePool" value="${redis.usePool}"></property> <property name="password" value="${redis.password}"></property> </bean>缓存清空
如果用户正常退出 缓存清空
如果用户非正常退出比如关闭浏览器 缓存清空
如果session到期,缓存清空,设置一般在缓存的配置文件中
如果修改了用户的权限,而用户不退出系统,修改的权限不会生效,需要手动调用realm的clearCache方法清除
public void clearCached() { PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals(); super.clearCache(principals); }redis
public static void remove(String cacheName, String key) { / getCache(cacheName).remove(key); RedisUtils.removeCache(key); } public static void removeCache(String key){ / LOGGER.debug("根据key从redis中删除对象 key [" + key + "]"); cacheManager.del(key.getBytes()); }注意 这些方法一般情况下修改用户权限都是在Service当中所以应该在service中调用清空缓存的方法
还可以在SecurityManager中配置Sessionmanager,配制方法增加property属性
<bean id="sessionManager" class="com.common.security.shiro.session.SessionManager"> <property name="sessionDAO" ref="sessionDAO"/> <property name="globalSessionTimeout" value="${session.sessionTimeout}"/> <property name="sessionValidationInterval" value="${session.sessionTimeoutClean}"/> lt;!-- <property name="sessionValidationSchedulerEnabled" value="false"/> --> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> <property name="sessionIdCookieEnabled" value="true"/> </bean><bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="600000"/> <property name="deleteInvalidSessions" value="true"/> </bean>
shiro管理session,shiro提供了sessionDao操作
<bean id="sessionDAO" class="com.minstone.common.security.shiro.session.CacheSessionDAO"> <property name="sessionIdGenerator" ref="idGen" /> <property name="activeSessionsCacheName" value="activeSessionsCache" /> <property name="cacheManager" ref="shiroCacheManager" /> </bean> 转载地址:https://blog.csdn.net/oppoppoppo/article/details/53432202