1. 程式人生 > 其它 >使用者資訊改變,系統踢出操作

使用者資訊改變,系統踢出操作

在很多業務場景中,都可能遇到一個問題,就是在使用者的資訊被系統管理員,或者上級人員或者自己修改後,如何及時更新系統儲存內的使用者資訊。

比如存在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 的載入順序原因,自動注入是無法生效的,相關知識點可以自行去了解。