多个WebSecurityConfigurerAdapter和Filter Chains

时间:2017-09-05 23:00:02

标签: spring spring-boot spring-security

我正在尝试为每种类型的身份验证使用单独的WebSecurityConfigurerAdapter为我的应用程序配置多种身份验证类型。

一般的想法是使用WebSecurityConfigurerAdapter configure(HttpSecurity http)方法来匹配url模式,并使用专用的专有过滤器(包括授权)进行所有身份验证。

@Configuration
@EnableWebSecurity
public class DemoMultipleWebSecurityConfigurerAdapter {

    @Order(1)
    @Configuration
    public static class BasicSecurityAdapter extends WebSecurityConfigurerAdapter {

        @Override
        public void configure(HttpSecurity http) throws Exception {
            String endpointPattern = "/api/basic/**";
            http.requestMatchers().antMatchers(endpointPattern);
            http.csrf().ignoringAntMatchers(endpointPattern);
            http.authorizeRequests().antMatchers(endpointPattern).authenticated();


            http.addFilterBefore(new MyBasicAuthFilter(), LogoutFilter.class);
        }
    }

    @Order(2)
    @Configuration
    public static class SSOSecurityAdapter extends WebSecurityConfigurerAdapter {
        @Override
        public void configure(HttpSecurity http) throws Exception {
            String endpointPattern = "/api/sso/**";
            http.requestMatchers().antMatchers(endpointPattern);
            http.csrf().ignoringAntMatchers(endpointPattern);
            http.authorizeRequests().antMatchers(endpointPattern).authenticated();


            http.addFilterBefore(new MySSOAuthFilter(), LogoutFilter.class);
        }
    }
}

在初始化期间,我可以看到每个WebSecurityConfigurerAdapter正在获取要配置的不同HttpSecurity实例(假设它有自己的过滤器链)但是在运行时,被调用的过滤器链始终是为第一个WebSecurityConfigurerAdapter创建的过滤器链。我打电话给哪个终点。

根据文档,Spring应该使用HttpSecurity实例来找到要过滤的正确过滤器链(根据url模式)。

关于我做错的任何想法? (我使用Spring 1.5.6-RELEASE来测试这个)

1 个答案:

答案 0 :(得分:1)

您不需要多个WebSecurityConfigurerAdapter;只需配置过滤器,使它们仅用于匹配URL模式。换句话说,添加所有过滤器,但使过滤器有条件地起作用。