令牌主动失效机制实现——Redis登录优化

令牌主动失效机制

令牌主动失效机制是一种安全措施,旨在防止令牌(如访问令牌、会话令牌等)在被泄露或不再需要时继续被使用。这种机制通过在特定条件下主动使令牌失效,从而增强系统的安全性

令牌主动失效机制的具体原理

● 登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中
● LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌
● 当用户修改密码成功后,删除redis中存储的旧令牌

具体实现

登录生成token的controller层

java 复制代码
......
// 在登录的controller层生成token之后把token添加到redis内
String token = JwtUtil.createJWT(
                jwtProperties.getAdminSecretKey(),
                jwtProperties.getAdminTtl(),
                claims);
        // 添加token到redis内同时设置过期时间
        redisTemplate.opsForValue().set("token", token, 2,TimeUnit.HOURS);
......

拦截器内解析并查看是否存在对应的token

java 复制代码
//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缓存

java 复制代码
@ApiOperation(value = "员工退出")
    @PostMapping("/logout")
    public Result<String> logout() {
        redisTemplate.delete(BaseContext.getCurrentId() + "_token");
        return Result.success();
    }
相关推荐
A-Jie-Y31 分钟前
JAVA框架-SpringBoot环境搭建指南
java·spring boot
深兰科技39 分钟前
深兰科技与淡水河谷合作推进:矿区示范加速落地
java·人工智能·python·c#·scala·symfony·深兰科技
码界奇点1 小时前
基于Spring Boot的前后端分离商城系统设计与实现
java·spring boot·后端·java-ee·毕业设计·源代码管理
一叶飘零_sweeeet1 小时前
深度剖析:Java 并发三大量难题 —— 死锁、活锁、饥饿全解
java·死锁·活锁·饥饿
IT乐手1 小时前
java 对比分析对象是否有变化
android·java
云烟成雨TD1 小时前
Spring AI Alibaba 1.x 系列【18】Hook 接口和四大抽象类
java·人工智能·spring
Hachi被抢先注册了1 小时前
Docker学习记录
java·云原生·eureka
不会写DN2 小时前
Go 项目中 Redis 缓存的实用设计与实现(Cache-Aside 模式)
redis·缓存·golang
devilnumber2 小时前
Spring Boot 2 vs Spring Boot 3:50 条核心区别 + 升级优势 + 避坑指南
java·spring boot·springboot升级
武超杰2 小时前
Spring Cloud Alibaba Nacos 进阶:配置隔离、集群、持久化与开机自启
java·开发语言