使用Java配置向SpringSecurityFilterChain添加多个自定义过滤器时遇到问题。使用xml配置时,我没有遇到问题。
我有几个自定义过滤器,并希望按特定顺序在SpringSecurityFilterChain中添加它们。我使用@Bean方法级别注释和覆盖方法为http安全性配置定义过滤器:
@Configuration
@EnableResourceServer
public static class CustomSecurityConfiguration extends ResourceServerConfigurerAdapter {
...
@Bean
public Filter filter1() {
return new Filter1();
}
@Bean
public Filter filter2() {
return new Filter2();
}
@Bean
public Filter filter3() {
return new Filter3();
}
@Bean
public Filter filter4() {
return new Filter4();
}
@Override
public void configure(HttpSecurity http) throws Exception {
...
http.addFilterBefore(filter1(), ChannelProcessingFilter.class)
.addFilterBefore(filter2(), HeaderWriterFilter.class)
.addFilterBefore(filter3(), AbstractPreAuthenticatedProcessingFilter.class)
.addFilterAfter(filter4(), AbstractPreAuthenticatedProcessingFilter.class);
...
}
...
}
当请求到来时,SpringSecurityFilter链具有我的自定义过滤器,但它们都是一个接一个地定位而不是遵循指定的位置。
看起来原因是我的实现使用默认的基于JDK接口的代理,而我的自定义过滤器代表了Filter接口周围的相同代理。因此,当调用addFilterBefore和addFilterAfter时,它们都被识别为同一个类,并且一个接一个地添加,导致顺序错误。
如何克服这个问题?
在org.springframework.security.config.annotation.web.builders。 FilterComparator 这些添加自定义过滤器的方法的实现可能是个问题吗?
这是在传入请求的调试模式中捕获的过滤器顺序:
这是在应用程序启动时捕获的Create filter chain
日志:
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@406c0ae9, org.springframework.security.web.context.SecurityContextPersistenceFilter@10aa5f84, org.springframework.security.web.header.HeaderWriterFilter@58b6268f, org.springframework.security.web.authentication.logout.LogoutFilter@46c03fe4, org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter@67520476, *.*.*.*.*.Filter1@3e1e994, *.*.*.*.*.Filter2@423c246a, *.*.*.*.*.Filter3@660b4981, *.*.*.*.*.Filter4@e4f3304, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1efc0d01, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1048c229, org.springframework.security.web.session.SessionManagementFilter@d814247, org.springframework.security.web.access.ExceptionTranslationFilter@10c41c8a, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3cd5db14