此文章解决的问题
在一个项目中,如果项目中使用到了shiro的缓存功能,往往会出现以下问题:
- 当用户修改密码后,需要用户重新登录,新密码才能生效,如果用户不退出,则新密码不会生效。当系统允许多用户登录时,此问题更加严重。
- 当对用户的权限进行修改时,问题同上。
- 如何对在线进行管理,包括:立即使session失效,踢出用户等。
本篇文章将会介绍为什么会出现上述问题,以及其解决思路,在阅读这篇文章之前,首先你需要了解shiro中的缓存管理器、sessionDao等。
缓存
shiro中缓存主要分为以下三个部分:
缓存类型 | 含义 |
---|---|
会话缓存 | 用户的session缓存 |
用户授权信息缓存 | 授权信息缓存,包含用户名、加密后的密码 |
用户权限信息缓存 | 用户的权限信息缓存,包含用户的角色、权限 |
shiro中存在一个缓存管理器,其按照名称对各个缓存进行隔离。
在我们配置sessionDao的时候,通常会配置如下文件:
<property name="activeSessionsCacheName" value="${shiro.cache.activeUserCacheName}"></property>
<property name="cacheManager" ref="shiroCacheManager"></property>
其中,activeSessionsCacheName就是缓存管理器中,保存会话缓存
的名称。
对于reaml而言,通常做如下配置:
<property name="authenticationCacheName" value="${shiro.cache.infoCacheName}"></property>
<property name="authorizationCacheName" value="${shiro.cache.permissionCacheName}"></property>
其中,authenticationCacheName就是缓存管理器中,保存用户授权信息缓存
的名称,authorizationCacheName则为用户权限信息缓存
的名称。
这三个缓存虽然使用同一个缓存管理器,但是通过名称
进行了隔离。