Spring Security 入门与实战指南(第四版,完结)

注:完整笔记可在 https://github.com/WuSangui571/SpringSecurity 中的 README.md 文件浏览,此处发表的是经由 GPT 润色过的精简版。

第 9 章 JWT(JSON Web Token)

9.1 概述

  • 标准:RFC 7519,JSON 格式,常用于无状态身份认证。

  • 结构:三段以 . 分隔,Header.Payload.Signature

9.2 三段含义

  1. Header(头部):元数据,声明算法与类型,示例:

    { "alg": "HS256", "typ": "JWT" }
    • Base64URL 编码后即为第一段。

  2. Payload(负载):存放声明(Claims),

    • 官方字段:iss, exp, sub, aud, nbf, iat, jti

    • 自定义字段:如 userId, name, roles 等。

    • 注意:可被解码,切勿放置敏感明文。

  3. Signature(签名):防篡改,

    HMACSHA256(
    base64UrlEncode(header) + "." + base64UrlEncode(payload),
    secret
    )
    • secret 仅服务器持有。

9.3 手动生成示例

String headerJson = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
String payloadJson = new ObjectMapper().writeValueAsString(claimsMap);
String headerEnc = base64UrlEncode(headerJson);
String payloadEnc = base64UrlEncode(payloadJson);
String signature = HMACSHA256(headerEnc + "." + payloadEnc, secret);
String jwt = headerEnc + "." + payloadEnc + "." + signature;

实际开发可使用开源库:

<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.5.0</version>
</dependency>

9.4 工具类示例(Auth0 Java JWT)

public class JwtUtil {
   private static final String SECRET = "your-secret";

   public static String createToken(Map<String,Object> claims) {
       return JWT.create()
          .withHeader(Map.of("alg","HS256","typ","JWT"))
          .withPayload(claims)
          .sign(Algorithm.HMAC256(SECRET));
  }

   public static DecodedJWT verifyToken(String token) {
       return JWT.require(Algorithm.HMAC256(SECRET))
          .build()
          .verify(token);
  }
}

9.5 JWT 在前后端分离中的应用

  1. 登录生成AuthenticationSuccessHandler 中创建 JWT 并写入 Redis,返回给前端。

  2. 前端存储sessionStorage(会话)或 localStorage(持久)。

  3. 请求携带:每次 AJAX 请求将 JWT 放入请求头,如 Authorization: Bearer <token>

  4. 后台验证:自定义 JwtFilter

    • 跳过登录接口。

    • 验证签名、解析负载、对比 Redis 中缓存。

    • 成功后将 Authentication 注入 SecurityContext

9.6 过期与失效策略

  • 设置过期:JWT 自带 exp,并在 Redis 中设置 TTL。

  • 服务重启:可监听 ContextClosedEvent 清空 Redis 缓存。

  • 主动退出LogoutSuccessHandler 中删除 Redis 中对应 Token。

9.7 完整流程

  1. 前端调用 /user/login,提交用户名/密码。

  2. Spring Security 验证通过后,生成 JWT 存入 Redis 并返回。

  3. 前端存储 JWT,并在后续请求头中携带。

  4. JwtFilter 验证 JWT 有效性并加载认证信息。

  5. 无需 Session,接口返回 JSON 数据。

  6. 重启或退出时清除 Redis 中的 Token,保证安全。

  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录