用户信息改变,系统踢出操作
在很多业务场景中,都可能遇到一个问题,就是在用户的信息被系统管理员,或者上级人员或者自己修改后,如何及时更新系统存储内的用户信息。
比如存在session内用户ID,名称等信息的更新问题。
解决思路:
1,首先在用户登录成功时,把标记用户登录的信息存在redis中,可以存用户ID,或者用户账号,只要可以标记用户唯一性就可以
2,在用户信息发生变化被修改时,将登录后存在redis的用户标记信息删除。
3,在过滤器中添加对用户标记信息的判断。如果存在就放行,不存在就说明该用户信息已发生改变,返回给前端约定好的code。前端可以采用页面弹框提示用户去重新登录。
关键代码:
登录
//用户ID存在redis中,用于过滤器检测用户身份是否改变 RBucket<String> bucketUser = redissonClient.getBucket(EtcConstant.LOGIN_PREFIX+ user.getUserId()); bucketUser.set(user.getMobile());
用户信息更新
//删除redis内的身份认证 RBucket<String> bucketUser = redissonClient.getBucket(EtcConstant.LOGIN_PREFIX+ busUser.getUserId()); bucketUser.delete();
过滤器验证
//判断用户身份信息是否发生改变 if (!checkUserAuthentication(token)) { redirectLoginPageByAuthen(response); } else {......} public boolean checkUserAuthentication(String token) { Claims claims = JwtTokenUtils.parseJWT(token); String userInfo = claims.get("userInfo", String.class); UserInfo userInfoStr = JsonUtil.jsonStrToObject(userInfo, UserInfo.class); RedissonClient redissonClient = (RedissonClient) SpringUtil.getBean("redisson"); RBucket<String> bucketUser = redissonClient.getBucket(EtcConstant.LOGIN_PREFIX + userInfoStr.getUserId()); if (StringUtils.isBlank(bucketUser.get())) { return false; } return true; } public static void redirectLoginPageByAuthen(HttpServletResponse response) throws IOException { response.setHeader("location", "/etc/index"); response.setContentType("text/html; charset=UTF-8"); JSONObject jsonObject = new JSONObject(); jsonObject.put("code", ResponseCode.USER_CHANGE.code()); jsonObject.put("data", "用户信息已改变,请重新登录"); PrintWriter writer = response.getWriter(); writer.print(jsonObject.toJSONString()); writer.flush(); }
(RedissonClient) SpringUtil.getBean("redisson")
在获取redis对象时,采用的是bean手动注入的方式,没有用Autowired自动注入。因为由于springboot 的filter 的加载顺序原因,自动注入是无法生效的,相关知识点可以自行去了解。