一、redis優化登錄接口。
? ? ? ? 原有代碼中在修改密碼在產生新令牌后并未將舊的令牌主動失效,舊的令牌依然可以使用 ,會產生安全隱患,所以需要對其進行優化。
1.令牌主動失效機制。
? ? ? ? (1)登錄成功后,給瀏覽器響應令牌的同時,把該令牌存儲到redis中;
? ? ? ? (2)Loginnterceptor攔截器中,需要驗證瀏覽器攜帶的令牌,并同時需要獲取到redis中存儲的與之相同的令牌;
? ? ? ? (3)當用戶修改密碼成功后,刪除redis中存儲的舊令牌。
2.SpringBoot集成redis。
? ? ? ? (1)導入spring-boot-starter-data-redis起步依賴;
? ? ? ? (2)在yml配置文件中,配置redis連接信息;
? ? ? ? (3)調用API(StringRedisTemplate)完成字符串的存取操作。??
3.令牌主動失效。?
? ? ? ? 修改UserController.java中的登錄接口以及修改密碼接口。??
//判斷密碼是否正確 loginUser對象中的password為密文if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){//登錄成功Map<String,Object> claims = new HashMap<>();claims.put("id",loginUser.getId());claims.put("username",loginUser.getUsername());String token = JwtUtil.genToken(claims);//把token存儲到redis中ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.set(token,token,1, TimeUnit.HOURS);return Result.success(token);}
//調用Service完成密碼更新userService.updatePwd(newPwd);//刪除redis中對應的TokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.getOperations().delete(token);return Result.success();
????????修改攔截器LoginInterceptor.java:
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌驗證String token = request.getHeader("Authorization");try{//從redis中獲取相同的tokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String redisToken = operations.get(token);if(redisToken == null){//token已經失效throw new RuntimeException();}Map<String, Object> claims = JwtUtil.parseToken(token);//把業務數據存儲到ThreadLocal中ThreadLocalUtil.set(claims);//放行return true;}catch (Exception e){//http響應狀態碼為401response.setStatus(401);//不放行return false;}}
? ? ? ? 運行測試發現已經修復原有缺陷。