如何确认Spring Boot3中@Order+@Component自定义过滤器在Security后执行?
问题:确认@Order+@Component自定义过滤器在Spring Security过滤器之后执行
我正在构建基于Spring Boot v3.1.1的应用,引入了Spring Security及OAuth2资源服务器依赖:
plugins { id 'java' id 'org.springframework.boot' version '3.1.1' id 'io.spring.dependency-management' version '1.1.0' } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' }
我创建了两个自定义过滤器,期望它们在Spring Security过滤器之后执行(处于过滤器链末尾):
@Order(1) @Component public class DeviceFilter extends OncePerRequestFilter {} @Order(2) @Component public class MdcFilter extends OncePerRequestFilter {}
这两个过滤器能正常工作,但我无法确认它们的执行顺序是否符合预期。
我尝试开启Spring Security的debug模式:
@Configuration @EnableWebSecurity(debug = true) public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .formLogin(AbstractHttpConfigurer::disable) .httpBasic(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable) // Removes CsrfFilter .logout(AbstractHttpConfigurer::disable) // Removes LogoutFilter .rememberMe(AbstractHttpConfigurer::disable) // Removes RememberMeAuthenticationFilter .requestCache(RequestCacheConfigurer::disable) // Removes RequestCacheAwareFilter .cors(withDefaults()) // Adds CorsFilter .authorizeHttpRequests(auth -> auth .requestMatchers("/public/**").permitAll() .anyRequest().authenticated() ) .sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .oauth2ResourceServer(oauth2 -> oauth2.jwt(withDefaults())); return http.build(); } }
控制台输出的Security过滤器链中并未显示我的两个自定义过滤器,但它们确实在运行:
Security filter chain: [ DisableEncodeUrlFilter WebAsyncManagerIntegrationFilter SecurityContextHolderFilter HeaderWriterFilter CorsFilter BearerTokenAuthenticationFilter SecurityContextHolderAwareRequestFilter AnonymousAuthenticationFilter SessionManagementFilter ExceptionTranslationFilter AuthorizationFilter ]
我猜测Spring Security过滤器与自定义过滤器相互独立,自定义过滤器不会被加入Security管理的过滤器数组,但对此并不确定。
我也曾在自定义过滤器中添加日志来检查顺序,日志显示两个过滤器的执行顺序正确:
09:05AM INFO DeviceFilter : {} DeviceFilter!!!!!!! 09:05AM INFO MdcFilter : {} MdcFilter!!!!!!!
但我仍无法确保它们是在Spring Security过滤器之后执行——因为我只希望它们在用户通过所有Security认证检查后才运行。
我还尝试过在securityFilterChain()方法中添加过滤器,这种方式下过滤器不再需要@Order和@Component注解:
@Configuration @EnableWebSecurity(debug = true) public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // ....... // ...... .addFilterAfter(new DeviceFilter(), AuthorizationFilter.class); .addFilterAfter(new MdcFilter(), DeviceFilter.class); return http.build(); } }
此时控制台输出的过滤器链中能看到我的自定义过滤器:
Security filter chain: [ DisableEncodeUrlFilter WebAsyncManagerIntegrationFilter SecurityContextHolderFilter HeaderWriterFilter CorsFilter BearerTokenAuthenticationFilter SecurityContextHolderAwareRequestFilter AnonymousAuthenticationFilter SessionManagementFilter ExceptionTranslationFilter AuthorizationFilter DeviceFilter // <================= MdcFilter // <================= ]
我更倾向于使用@Order+@Component的方式,因为这种方式对我来说更简便。
我查阅过相关讨论,但仍有疑问:如何确认使用@Order和@Component的自定义过滤器确实在Spring Security过滤器之后执行?
感谢您的帮助,任何相关建议都将不胜感激。
内容的提问来源于stack exchange,提问作者RRGT19
相关产品推荐
相关产品推荐

