令牌主动失效机制实现——Redis登录优化
令牌主动失效机制
令牌主动失效机制是一种安全措施,旨在防止令牌(如访问令牌、会话令牌等)在被泄露或不再需要时继续被使用。这种机制通过在特定条件下主动使令牌失效,从而增强系统的安全性。
令牌主动失效机制的具体原理
● 登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中
● LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌
● 当用户修改密码成功后,删除redis中存储的旧令牌
具体实现
登录生成token的controller层
......
// 在登录的controller层生成token之后把token添加到redis内
String token = JwtUtil.createJWT(
jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
claims);
// 添加token到redis内同时设置过期时间
redisTemplate.opsForValue().set("token", token, 2,TimeUnit.HOURS);
......
拦截器内解析并查看是否存在对应的token
//1、从请求头中获取令牌
String token = request.getHeader(jwtProperties.getAdminTokenName());
//2、校验令牌
try {
log.info("jwt校验:{}", token);
Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());
log.info("当前员工id:", empId);
if(!redisTemplate.hasKey(empId+"_token")){
throw new RuntimeException();
}
// 将id存入ThreadLocal
BaseContext.setCurrentId(empId);
//3、通过,放行
return true;
} catch (Exception ex) {
//4、不通过,响应401状态码
response.setStatus(401);
return false;
}
}
退出登录或者修改密码时清空token缓存
@ApiOperation(value = "员工退出")
@PostMapping("/logout")
public Result<String> logout() {
redisTemplate.delete(BaseContext.getCurrentId() + "_token");
return Result.success();
}
原文地址:https://blog.csdn.net/2301_80412275/article/details/145214470
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!