spring boot + shiro 动态更新用户信息
场景
用户A在线,管理员在后台更改了用户A信息(资料或权限)之后;用户A再进行下一步操作时,会被拦截并退出登录状态,再登录才可以执行操作;来确保用户A的信息同步更新。
后台权限管理系统
技术实现
20200808新版本更新
版本升级及内容优化版本,改动内容:
版本更新,springboot从1.5+升级到2.1+;
权限缓存使用redis;
验证码使用redis;
权限验证完善。
前篇:
基于前篇,新增功能:
新增用户表版本version字段;
更新用户操作时,通过version字段来保证数据一致;
新增通过拦截器实现动态更新用户信息(用户资料、用户权限);
新增登录成功后默认页面home.html;
页面操作细节优化
wyait-manage、wyait-manage-1.2.0源码都更新了以上功能!
以及新增了springboot项目,开发和线上jdk版本不一致导致项目无法启动、无法加载的问题的排查及解决思路。
后篇:
项目源码:(包含数据库源码)
动态更新用户权限实现
使用shiro可能会遇到修改了用户权限后,没有立即生效,需要等到用户重新登录后才能生效;不能立即同步更新,显然是不合理的。
解决方案
【实测无效】!!!
授权方法,是在shiro进行鉴权的时候才能触发。只是配置了authc/user/anon等,不会触发;
perms,port,rest,roles,ssl等,会触发授权方法doGetAuthorizationInfo。
自定义ShiroRealm中添加清除全部用户权限缓存的方法:
/**
* 清除所有缓存
*/
public void clearCachedAuth(){
this.clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals());
}
在更新用户权限的地方调用该方法,清除缓存:
//清除ehcache中所有用户权限缓存
RealmSecurityManager rsm = (RealmSecurityManager)SecurityUtils.getSecurityManager();
ShiroRealm authRealm = (ShiroRealm)rsm.getRealms().iterator().next();
authRealm.clearCachedAuth();
想要达到的效果:在用户进行后台请求的时候,无缓存就会再次请求授权方法,更新自己的权限。
实测,无效!缓存依然存在!原因可能是使用ehcache导致的。
实际解决方案参考下文中的方案二!
动态更新用户信息(用户资料、用户权限)
在系统中,由管理员更改了用户A信息后,如果用户A在线,无法及时更新相关的改动;
更新用户资料、权限等信息,如果该用户在线,同步更新用户信息解决方案:
方案一【不推荐】:SessionDAO控制
在ShiroRealm中通过SessionDAO拿到所有在线的用户,
Collection sessions = sessionDAO.getActiveSessions();
遍历找到匹配的,根据情况,退出登录或更新用户信息:
@Autowired
private SessionDAO sessionDAO;
public void updateShiroUser(String loginName){
Collection sess