Spring Security 6中OncePerRequestFilter未执行问题求助
问题排查与修复建议
你遇到的JwtFilter未执行问题,核心原因和修复方案如下:
1. 致命拼写错误(直接导致过滤器未加载)
在AppConfiguration的securityFilterChain方法中,存在两处明显拼写错误:
// 错误1:httBasic 少了一个字母p http.httBasic(Customizer.withDefaults()); // 正确写法: http.httpBasic(Customizer.withDefaults()); // 错误2:configuratonSource 少了一个字母i http.cors(configurer -> configurer.configuratonSource(corsConfig())); // 正确写法: http.cors(configurer -> configurer.configurationSource(corsConfig()));
第一个错误会导致Spring Security无法初始化BasicAuthenticationFilter,而你调用addFilterAt(new JwtFilter(), BasicAuthenticationFilter.class)时,指定的目标过滤器不存在,最终JwtFilter无法被加入过滤链;第二个错误会导致CORS配置失效,需一并修复。
2. 过滤器实例化优化(更规范的写法)
你的JwtFilter已经添加@Component注解,属于Spring管理的Bean,建议直接注入而非手动new实例,避免重复创建对象:
@Configuration @EnableWebSecurity public class AppConfiguration { private final JwtFilter jwtFilter; // 构造注入Spring管理的JwtFilter实例 public AppConfiguration(JwtFilter jwtFilter) { this.jwtFilter = jwtFilter; } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { System.out.println("Inside filterChain."); http.cors(configurer -> configurer.configurationSource(corsConfig())); http.csrf(AbstractHttpConfigurer::disable); http.authorizeHttpRequests((requests) -> requests .requestMatcher("/actuator/health").permitAll() .anyRequest().authenticated()); http.httpBasic(Customizer.withDefaults()); http.addFilterAt(jwtFilter, BasicAuthenticationFilter.class); return http.build(); } // 确保corsConfig()方法已正确实现 private CorsConfigurationSource corsConfig() { CorsConfiguration configuration = new CorsConfiguration(); // 补充你的CORS规则配置,例如允许的源、请求方法等 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } }
3. 额外排查点
- 请求路径验证:确保测试的请求不是
/actuator/health(该路径被设置为permitAll,虽然OncePerRequestFilter默认处理所有请求,但建议测试需要认证的接口来验证过滤器执行情况)。 - 日志级别调试:将Spring Security日志级别调整为DEBUG,查看过滤链初始化日志,确认
JwtFilter是否被加入链中:logging.level.org.springframework.security=DEBUG - 过滤器顺序调整:若修复后仍未执行,可尝试使用
addFilterBefore或addFilterAfter指定明确顺序,例如:http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
内容的提问来源于stack exchange,提问作者Rafael Barioni
相关产品推荐
相关产品推荐

