用途
该技能面向需要在 Spring Boot 应用中自行签发并校验第一方 JWT 访问令牌与刷新令牌的场景,包括认证过滤器、密码编码、基于角色的访问控制(RBAC)以及 JSON 格式的 401/403 错误响应。
主要能力
- 提供编译好的 SecurityConfig,配合过滤器与服务使用,采用 lambda DSL、无状态 bearer 认证、角色规则、JSON 401/403 处理器,并禁用安全链过滤器的 servlet 注册。
- 提供经过测试的 JwtService 与 JwtAuthenticationFilter 模板,配置键为 app.jwt.secret、app.jwt.access-token-expiration、app.jwt.refresh-token-expiration(毫秒)。
- 过滤器会以 401 和 Bearer challenge 拒绝过期、格式错误、被篡改、缺少过期时间以及刷新令牌;认证前检查当前用户的 enabled、locked、account-expired、credentials-expired 标志;已删除用户同样返回 401。
- 支持方法级安全,例如 @PreAuthorize("hasRole('ADMIN')")、@PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id")、@PostAuthorize("returnObject.email == authentication.name")。
- 提供 AuthController 示例,包含 /api/v1/auth 下的 login、refresh、register 端点,以及 AuthResponse 记录。
使用方式
依赖包括 spring-boot-starter-security,以及 io.jsonwebtoken 的 jjwt-api、jjwt-impl、jjwt-jackson 0.12.6(后两者为 runtime scope)。application.yml 中配置 app.jwt.secret(来自环境变量 JWT_SECRET,至少 256 位 base64 编码密钥)、access-token-expiration(示例 900000,即 15 分钟)、refresh-token-expiration(示例 604800000,即 7 天)。过滤器 bean 仅注册在安全链中,通过 FilterRegistrationBean<JwtAuthenticationFilter> 将 enabled 设为 false 来禁用 servlet 容器注册。
适用场景
适用于单服务、自签第一方令牌契约的 Spring Boot 后端接口鉴权。若需跨服务共享签名密钥或接受其他服务令牌,需先定义并校验 issuer 与 audience、密钥轮换与吊销;Spring Security 的 resource-server 支持也可校验自定义 JWT,若已适用应保留。
限制与注意事项
- 示例创建刷新令牌但未实现刷新端点;生产刷新流程必须只接受 type=refresh,每次使用轮换刷新令牌并吊销旧令牌(例如使用数据库或 Redis 中的哈希令牌族记录)。
- 数据库故障与下游应用失败必须保持为服务器失败,不能伪装成无效凭证;即使公开端点,提供的无效令牌也应被拒绝。
- 过滤器示例错误体使用 Problem Details;对既有遗留 API,需将响应与入口点适配到既有错误契约。切勿记录 bearer 令牌。
- 控制器 advice 无法处理 dispatcher servlet 之前抛出的异常。
- 常见陷阱:不要广泛捕获 AuthenticationException 而丢失 AuthenticationServiceException;不要仅凭有效 JWT 登录已禁用或锁定用户;使用 AbstractHttpConfigurer::disable 而非旧 API;在过滤器中捕获 ExpiredJwtException;不要跳过 exceptionHandling();密钥始终来自环境变量;使用 STATELESS 会话策略;bearer 过滤器只接受 type=access 令牌;启用 @EnableMethodSecurity;BCrypt 强度生产环境用 12;令牌校验逻辑放在过滤器中;刷新令牌建议使用 httpOnly cookie 或安全存储,而非 localStorage。
分类
根据其明确用途(Spring Boot 后端认证与授权实现),归入编程与开发(coding)。