使用者資訊改變,系統踢出操作
阿新 • • 發佈:2022-03-18
在很多業務場景中,都可能遇到一個問題,就是在使用者的資訊被系統管理員,或者上級人員或者自己修改後,如何及時更新系統儲存內的使用者資訊。
比如存在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 的載入順序原因,自動注入是無法生效的,相關知識點可以自行去了解。