SpringSecurityFilterChain

时间:2017-11-15 16:08:42

标签: java spring spring-security spring-java-config

使用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 这些添加自定义过滤器的方法的实现可能是个问题吗?

这是在传入请求的调试模式中捕获的过滤器顺序:

enter image description here

这是在应用程序启动时捕获的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

0 个答案:

没有答案