主页 > 人工智能  > 

redis优化token校验主动失效


场景:在普通的token颁发和校验中 当用户发现自己账号和密码被暴露了时修改了登录密码后旧的token仍然可以通过系统校验直至token到达失效时间,这肯定是不安全的,所以系统需要token主动失效的一种能力解决方案:我们可以使用redis来实现redis主动失效的的功能需求实现逻辑: 在每次用户登录后颁发token的同时往redis数据库中存储一份颁发给用户的token每次每次用户请求时除了解析token外还需要查询redis中是否有当前token有则校验通过,没有则校验失败每次用户修改密码后删除redis中当前用所携带的token,从而使旧token无法通过token校验 代码实现 pom.xml中添加redis坐标 <!--redis坐标--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. 配置文件application.yml中配置redis相关信息 spring: data: redis: host: redis所在的ip,本机的redis服务填localhost port: redis服务端口,默认6379 password: redis中设置的密码,没有就不需要 3. 颁发token时往redis中存储token //UserController中添加私有属性stringRedisTemplate并实例化 @Autowired private StringRedisTemplate stringRedisTemplate; //登录接口中把token存到redis 过期时间3小时 stringRedisTemplate.opsForValue().set(token,token,3, TimeUnit.HOURS); 4. 登录时校验是否redis中有当前token package org.example.intercopters; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.example.utils.JwtUtil; import org.example.utils.ThreadLocalUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import java.util.Map; @Component //注册拦截器 将其放入ioc容器中 public class LoginInterceptor implements HandlerInterceptor { @Autowired private StringRedisTemplate redisTemplate; //创建登录身份校验拦截器 @Override //请求开始前触发的拦截方法 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //令牌验证 String token = request.getHeader("Authorization"); //去除token的前缀标记"Bearer " var newToken = token.contains("Bearer ")?token.substring("Bearer ".length()):token; try { **//从redis获取相同的token String redisToken = redisTemplate.opsForValue().get(newToken); if(redisToken == null){ //redis失效 throw new RuntimeException("token失效"); }** Map<String, Object> claims = JwtUtil.parseToken(token); //把用户信息存储到ThreadLocal中,tomcat会在每次接口请求时创建一个线程 而ThreadLocal中存储的数据是线程安全的 ThreadLocalUtil.set(claims); //放行 return true; } catch (Exception e) { //设置响应状态码 response.setStatus(401); //设置响应字符集和响应内容 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); String errorMessage = "未登录"; response.getWriter().write("{\"error\": \"" + errorMessage + "\"}"); //不放行 return false; } } @Override //请求完成后触发的拦截方法 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //清空ThreadLocal中的数据 ThreadLocalUtil.remove(); } } 5. 修改密码后删除redis中的token //修改密码接口中删除redis中对应的token ValueOperations<String, String> operations = stringRedisTemplate.opsForValue(); operations.getOperations().delete(newToken); 在本地开发中如果使用本地redis每次开发前还得去启动本地redis,就很麻烦,如果你有一个云服务器就可以本地连云服务器redis就不用每次去启动redis了,下面是实现教程 https://blog.csdn.net/weixin_45695974/article/details/123244011
标签:

redis优化token校验主动失效由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“redis优化token校验主动失效