You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成测试中Bearer Token鉴权401问题解决

Spring Boot集成测试鉴权401问题排查与解决方案

1. 测试类安全配置校验

  • 确保集成测试类标注@SpringBootTest和@AutoConfigureMockMvc,未错误禁用Spring Security自动配置(如@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)会导致过滤链失效,但401通常是过滤链生效但验证失败)。
  • 若使用@MockBean替换JwtDecoder,需确保Mock实例能正确解析生成的Token:
@MockBean
private JwtDecoder jwtDecoder;

@BeforeEach
void setUp() {
    // 配置Mock Decoder解析Mock Token的Claims
    when(jwtDecoder.decode(anyString())).thenReturn(Jwt.withTokenValue(mockToken)
            .header("alg", "HS256")
            .claim("sub", "test-user")
            .claim("scope", "ROLE_USER")
            .build());
}

2. MockJwtTokenProvider生成逻辑检查

  • 确认生成的Token包含必填Claims:sub(用户标识)、exp(未来过期时间)、iss(需与应用配置的spring.security.oauth2.resourceserver.jwt.issuer-uri一致)。
  • 校验签名密钥与应用配置匹配:若应用用HS256签名,MockProvider需使用相同密钥:
// MockJwtTokenProvider核心生成逻辑
private final SecretKey secretKey = Keys.hmacShaKeyFor("your-configured-secret".getBytes(StandardCharsets.UTF_8));

public String generateToken(UserDetails userDetails) {
    return Jwts.builder()
            .setSubject(userDetails.getUsername())
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时有效期
            .signWith(secretKey, SignatureAlgorithm.HS256)
            .compact();
}

3. 安全过滤链规则校验

  • 查看SecurityFilterChain配置,确保/auth/refresh-token和/auth/logout接口被设置为需要认证:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/auth/login", "/auth/register").permitAll()
                    .requestMatchers("/auth/refresh-token", "/auth/logout").authenticated()
            )
            .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
    return http.build();
}
  • 注意:若logout接口要求验证Refresh Token而非Access Token,需单独生成Refresh Token并配置对应解析逻辑。

4. 测试请求头正确性验证

  • 确保请求头Authorization格式正确,Bearer 后紧跟Token,无多余空格:
mockMvc.perform(post("/auth/refresh-token")
        .header(HttpHeaders.AUTHORIZATION, "Bearer " + mockToken)
        .contentType(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk());
  • 可在测试中打印请求头和Token内容,确认传递无误。

5. 错误日志精准定位

  • 根据日志信息锁定问题:
    • 若日志显示JWT signature does not match:说明Mock Token签名密钥与应用配置不一致;
    • 若显示InsufficientAuthenticationException:说明Token缺失必要Claims或权限;
    • 若显示FilterChainProxy未匹配到目标接口规则:说明安全过滤链配置错误。

6. 真实Token401额外排查点

  • 确认真实Token未过期,且包含目标接口所需权限(如ROLE_USER);
  • 检查应用JwtDecoder配置:若使用OIDC issuer-uri,测试环境需能正常访问该地址,或替换为本地Decoder。

内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:32:35