基于JWT+Redis的登录流程实现

发布于:2025-05-27 ⋅ 阅读:(74) ⋅ 点赞:(0)

基于JWT+Redis的登录流程实现的 Mermaid 时序图,详细展示了验证码生成、登录验证、JWT签发、Redis存储及拦截器校验等全过程。

sequenceDiagram
    participant 用户
    participant 前端页面
    participant 后端服务
    participant Redis
    participant JwtUtil
    participant 拦截器
    participant LoginUserContext

    %% 获取验证码流程
    用户->>前端页面: 请求获取验证码
    前端页面->>后端服务: /getCaptcha
    后端服务->>后端服务: 创建SpecCaptcha图形验证码
    后端服务->>后端服务: 生成验证码文本(verCode)
    后端服务->>Redis: set("code:{uuid}", verCode, 30分钟)
    后端服务-->>前端页面: 返回验证码Base64图像和验证码key

    %% 登录流程
    用户->>前端页面: 输入账号、密码、验证码
    前端页面->>后端服务: /loginRedis(username, password, captchaCode, captchaKey)
    后端服务->>Redis: 获取验证码 get("code:{captchaKey}")
    alt 验证码错误
        后端服务-->>前端页面: 验证码错误,抛出异常
    else 验证码正确
        后端服务->>后端服务: sha256加密密码
        后端服务->>数据库: 查询用户(username+加密密码)
        alt 用户不存在
            后端服务-->>前端页面: 用户名或密码错误
        else 用户存在
            JwtUtil->>JwtUtil: 生成JWT token
            后端服务->>Redis: set("login:{token}", LoginUser, 30分钟)
            后端服务-->>前端页面: 返回token
        end
    end

    %% 用户请求其他接口
    用户->>前端页面: 携带Token访问接口
    前端页面->>拦截器: 添加 Authorization: Bearer {token}
    拦截器->>JwtUtil: 解析JWT Token
    JwtUtil-->>拦截器: 提取 userId、username
    拦截器->>LoginUserContext: 保存用户信息到ThreadLocal

    %% 刷新token(可选)
    拦截器->>Redis: 获取用户信息 login:{token}
    alt 用户存在
        Redis->>拦截器: 返回用户信息
        拦截器->>LoginUserContext: 保存用户
        拦截器->>Redis: 重置token过期时间
    else 用户信息不存在
        拦截器-->>前端页面: 拦截请求
    end

    %% 请求完成后清除ThreadLocal
    拦截器->>LoginUserContext: 清除用户信息(clear)
基于JWT+Redis的登录流程实现

 补充说明:
1、验证码生成依赖:com.wf.captcha.SpecCaptcha

2、密码加密方式:DigestUtils.sha256Hex

3、登录成功后会:

        创建 JWT Token(包含 userId 和 username)

        将用户信息以 "login:{token}" 存入 Redis,有效期30分钟

        后续所有接口请求都需要在 Header 中携带 Authorization: Bearer {token}

4、使用多个拦截器进行权限验证与刷新:

        AuthenticationInterceptor 负责解析 Token 并设置上下文

        RefreshTokenInterceptor 刷新 Token 过期时间

        LoginInterceptor 判断用户是否存在于上下文中


网站公告

今日签到

点亮在社区的每一天
去签到