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

Spring Boot Kotlin集成JWT开启方法安全报AuthenticationCredentialsNotFoundException问题

问题排查与解决方案

问题1:认证执行时机异常、双过滤器链问题

出现两个ApplicationFilterChain属于配置错误导致的异常情况,核心原因几乎都是自定义过滤器的注册逻辑有误:

  • 首先排查TokenAuthenticationFilter是否被误注册到了Spring容器:如果你给该类加了@Component/@Service注解,或者在配置类里把它声明成了@Bean,Spring Boot的自动Servlet过滤器注册机制会把它加到全局过滤器链,和你手动注入到WebSecurityConfigurerAdapter里的Spring Security过滤器链形成两条执行链路。
  • 全局过滤器链的执行优先级远高于Spring Security过滤器链,你看到的第一条不含自定义过滤器的链就是Spring Security的主安全链,执行到@PreAuthorize对应的方法安全前置校验时,SecurityContextHolder还没有被自定义过滤器赋值,自然抛出AuthenticationCredentialsNotFoundException,后面的自定义过滤器执行已经不生效。
  • 修复方案:
    • 去掉TokenAuthenticationFilter上所有Spring容器注册注解,不要把它声明为Bean
    • 在WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法中手动实例化该过滤器,通过http.addFilterBefore(自定义过滤器实例, UsernamePasswordAuthenticationFilter.class)注入到Security链中,保证认证逻辑在方法安全校验前执行
    • 额外校验:@EnableGlobalMethodSecurity注解必须加在安全配置类或者根启动类上,不要加在业务Bean上,避免方法安全切面初始化时机早于安全过滤器链。

问题2:2021年后Spring Boot无状态JWT认证最优方案

2021年之后对应Spring Boot 2.4+、Spring Security 5.4+版本,官方已经正式废弃WebSecurityConfigurerAdapter,旧教程中继承该类的配置方式属于过时写法,存在很多隐性配置坑:

  • 更优的无状态JWT实现优先选择Spring Security官方提供的OAuth2 Resource Server模块,不需要自己手动实现AbstractAuthenticationProcessingFilter:
    • 引入spring-boot-starter-oauth2-resource-server依赖
    • 直接声明SecurityFilterChain类型的Bean配置安全规则,添加http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)配置
    • 在application配置文件中指定JWT签名公钥、签发者等校验参数即可,框架会自动完成JWT解析、身份校验、权限注入、上下文赋值全流程,不会出现过滤器顺序、重复注册这类问题
  • 旧教程的逻辑本质是通用的,但过时API带来的隐性问题极多,如果你的Spring Boot版本高于2.4,不建议再使用手动自定义过滤器的旧方案。

内容的提问来源于stack exchange,提问作者IARI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 20:15:03