用户信息改变,系统踢出操作

在很多业务场景中,都可能遇到一个问题,就是在用户的信息被系统管理员,或者上级人员或者自己修改后,如何及时更新系统存储内的用户信息。

比如存在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 的加载顺序原因,自动注入是无法生效的,相关知识点可以自行去了解。

posted @ 2022-03-18 17:39  半柠檬  阅读(49)  评论(0编辑  收藏  举报