Spring Boot库中如何正确添加自定义Spring Security过滤器链Filter
Spring Boot库无侵入添加自定义Security过滤器的正确实现方案
不要强制用户继承自定义的WebSecurityConfigurerAdapter,这种方案侵入性强,且依赖用户主动调用父类方法才会生效。推荐采用无侵入的自动配置方案,根据你使用的Spring版本选择对应实现:
推荐实现(适配Spring Boot 2.4+/Spring Security 5.4+)
核心依赖Spring Security提供的HttpSecurityCustomizer接口,所有该接口的实现Bean会被自动应用到所有SecurityFilterChain的构建流程中,完全兼容用户自定义的安全配置,不会产生冲突。
自动配置类示例代码:
@Configuration @ConditionalOnWebApplication @ConditionalOnClass({HttpSecurity.class, AbstractPreAuthenticatedProcessingFilter.class}) public class MySecurityAutoConfiguration { // 注册自定义过滤器Bean @Bean @ConditionalOnMissingBean public MyFilter myFilter() { return new MyFilter(); } // 注册自定义配置器,自动将过滤器插入到Security链指定位置 @Bean public HttpSecurityCustomizer<HttpSecurity> myFilterCustomizer(MyFilter myFilter) { return http -> { try { http.addFilterBefore(myFilter.getFilter(), AbstractPreAuthenticatedProcessingFilter.class); } catch (Exception e) { throw new RuntimeException("自定义认证过滤器注册失败", e); } }; } // 可选:禁止过滤器被自动注册到全局Servlet过滤器链,仅在Security链中生效 @Bean public FilterRegistrationBean<Filter> disableFilterAutoRegister(MyFilter myFilter) { FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>(myFilter.getFilter()); registration.setEnabled(false); return registration; } }
完成代码后将自动配置类的全限定名添加到META-INF/spring.factories文件中,通过Spring Boot自动装配机制触发加载,用户引入依赖即可直接生效,无需修改自身安全配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.xxx.MySecurityAutoConfiguration
低版本兼容实现(适配Spring Security 5.4以前版本)
如果需要兼容旧版本,可注册一个优先级最低的WebSecurityConfigurerAdapter,仅执行过滤器添加逻辑,不修改任何权限规则,不会覆盖用户的自定义配置:
@Configuration @Order(Ordered.LOWEST_PRECEDENCE - 100) // 优先级设为最低,保证用户配置先执行 public class MyFilterSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private MyFilter myFilter; @Override protected void configure(HttpSecurity http) throws Exception { // 仅添加过滤器,不配置任何权限规则,避免覆盖用户配置 http.addFilterBefore(myFilter.getFilter(), AbstractPreAuthenticatedProcessingFilter.class); } }
同样将该配置类添加到spring.factories的自动配置列表即可。
注意事项
- 不要在自动配置类中添加
@EnableWebSecurity注解,该注解会关闭Spring Boot默认的安全自动配置,会和用户配置产生冲突 - 如果过滤器仅需对特定路径生效,可在过滤器内部自行实现路径匹配逻辑,无需修改全局安全配置
- 如果存在多个安全过滤器链的场景,
HttpSecurityCustomizer会自动应用到所有链中,无需额外适配
内容的提问来源于stack exchange,提问作者Adam Jarvis
相关产品推荐
相关产品推荐

