2017-09-05 79 views
1

我想为我的应用程序使用单独的WebSecurityConfigurerAdapter为每种类型的身份验证配置多个身份验证类型。多WebSecurityConfigurer适配器和筛选链

总体思路是使用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

你不需要多个WebSecurityConfigurerAdapter;只需配置筛选器,以便它们仅用于匹配URL模式。换句话说,添加所有的过滤器,但是使过滤器有条件地工作。

+0

这就是我最终做的事情(使用Spring使用的相同匹配组件来路由到Spring中注册的Filter中的相应Filter)。 –