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

Spring Security 6集成JWT时/auth接口返回401未授权问题排查

问题分析与解决方案

以下是导致/auth/**接口返回401 Unauthorized的几个核心问题及修复方案:


1. CSRF保护未正确禁用

你的当前配置中,csrf()仅调用了方法但未禁用,导致POST请求(登录/注册)被Spring Security的CSRF保护拦截,返回401/403错误。

修复代码(SecurityConfig类的filterChain方法):

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
            .csrf(csrf -> csrf.disable()) // 正确禁用CSRF
            .cors(cors -> cors.disable())
            .exceptionHandling(ex -> ex.authenticationEntryPoint(jwtAuthenticationEntryPoint))
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/auth/**").permitAll()
                    .anyRequest().authenticated())
            .authenticationProvider(authenticationProvider())
            .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
            .build();
}

2. JwtAuthenticationFilter依赖注入错误

Filter中注入的JwtTokenProvider与实际的JWT工具类JwtTokenService类名不匹配,导致依赖注入失败,调用jwtTokenProvider.getJwtFromCookies()时会抛出空指针异常,干扰请求流程。

修复代码(JwtAuthenticationFilter类):

@Autowired
private JwtTokenService jwtTokenService; // 替换为正确的类名

// 对应修改parseJwt方法
private String parseJwt(HttpServletRequest request) {
    String jwt = jwtTokenService.getJwtFromCookies(request);
    return jwt;
}

// 同时修改doFilterInternal中的验证逻辑
if (jwt != null && jwtTokenService.validateToken(jwt)) {
    String username = jwtTokenService.getUserNameFromToken(jwt);
    // ... 其余逻辑不变
}

3. AuthController中PasswordEncoder未注入

构造函数未包含PasswordEncoder参数,导致register方法中encoder为null,执行加密操作时会抛出空指针异常,同时可能触发Spring Security的认证拦截。

修复代码(AuthController类):

private final UserRepository userRepository;
private AuthenticationManager authenticationManager;
private JwtTokenService provider;
private PasswordEncoder encoder;

// 修改构造函数,注入PasswordEncoder
public AuthController(UserRepository userRepository, AuthenticationManager authenticationManager, JwtTokenService provider, PasswordEncoder encoder) {
    this.userRepository = userRepository;
    this.authenticationManager = authenticationManager;
    this.provider = provider;
    this.encoder = encoder;
}

4. JwtTokenService配置读取错误

@Value("${application.secret")缺少闭合的},导致无法读取JWT密钥配置,后续token生成和验证都会失败,虽然暂时不影响登录接口访问,但会导致登录成功后无法正确生成token。

修复代码(JwtTokenService类):

@Value("${application.secret}") // 添加闭合的}
private String jwtSecret;

额外注意事项

  • 确保你的AuthServiceImpl正确实现了UserDetailsService接口,loadUserByUsername方法能正确返回用户信息。
  • 检查application.properties或application.yml中是否配置了application.secret和application.jwtCookieName参数。

内容的提问来源于stack exchange,提问作者Daria Mihăilă

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:40:26