springboot update数据_spring boot + shiro 动态更新用户信息

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值