
JWT 认证返回 403 错误,通常因令牌校验逻辑缺陷导致——关键问题在于 isTokenValid() 方法中错误地将 isTokenExpired(token) 的返回值直接用于判断有效性,而未取反,致使有效令牌被判定为无效。
jwt 认证返回 403 错误,通常因令牌校验逻辑缺陷导致——关键问题在于 `istokenvalid()` 方法中错误地将 `istokenexpired(token)` 的返回值直接用于判断有效性,而未取反,致使有效令牌被判定为无效。
在基于 Spring Security 的 JWT 认证流程中,JwtAuthenticationFilter 负责解析请求头中的 Bearer Token,并通过 JwtService.isTokenValid() 验证其合法性。一旦该方法返回 false,认证流程即中断,SecurityContextHolder 不会设置认证上下文,后续请求因未通过身份验证而被拒绝(HTTP 403 Forbidden),即使 Token 本身结构正确、签名有效、未过期。
核心问题定位:逻辑反转缺失
查看原始 isTokenValid 实现:
public boolean isTokenValid(String token, UserDetails userDetails) {
final String username = extractUsername(token);
return (username.equals(userDetails.getUsername())) && isTokenExpired(token); // ❌ 错误!
}
此处 isTokenExpired(token) 返回 true 表示 已过期,而有效性判断应要求 Token 未过期,因此必须使用 !isTokenExpired(token)。当前代码等价于:“用户名匹配 且 Token 已过期” → 永远返回 false(除非 Token 过期且用户名匹配,但这显然不是合法访问条件),导致所有受保护接口均被拦截。
✅ 正确实现应为:
public boolean isTokenValid(String token, UserDetails userDetails) {
final String username = extractUsername(token);
return username != null
&& username.equals(userDetails.getUsername())
&& !isTokenExpired(token); // ✅ 关键修复:取反过期判断
}
同时建议增强健壮性,增加 username != null 判空(避免 extractUsername 返回 null 时 NullPointerException)。
其他需同步检查的关键点:
-
Secret Key 编码一致性:当前 SECRET_KEY = "This is my secret key" 是明文字符串,但 getSignInKey() 尝试按 Base64 解码。这会导致 Decoders.BASE64.decode() 抛出 IllegalArgumentException(非 Base64 字符串)。
✅ 正确做法二选一:- 方案 A(推荐):使用原始字节数组签名(无需 Base64):
private Key getSignInKey() { return Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8)); } - 方案 B:若坚持 Base64,需确保 SECRET_KEY 是合法 Base64 字符串(如 "dGhpcyBpcyBteSBzZWNyZXQ="),并保持编码/解码一致。
- 方案 A(推荐):使用原始字节数组签名(无需 Base64):
-
Token 传递格式:前端必须在请求头中严格使用 Authorization: Bearer
格式。JwtAuthenticationFilter 中 authHeader.startsWith("Bearer ") 对大小写敏感,建议改为忽略大小写判断: if (authHeader == null || !authHeader.toLowerCase().startsWith("bearer ")) { ... } 权限配置验证:SecurityConfiguration 中 .antMatchers("/v1/api/auth/**").permitAll() 仅放行 /auth 下路径,确保受保护接口(如 /v1/api/user/profile)确实落在 .anyRequest().authenticated() 范围内,且未被其他 antMatchers 规则意外覆盖。
总结
403 错误的根因是认证逻辑短路:isTokenValid 始终返回 false,使 SecurityContextHolder 无法建立认证上下文。修复 !isTokenExpired(token) 是首要步骤;同步修正密钥处理方式、强化空值防护及请求头解析鲁棒性,才能构建稳定可靠的 JWT 认证链。完成修复后,携带有效 Bearer Token 的请求将成功通过过滤器,进入授权与业务处理阶段。











