我正在尝试为每种类型的身份验证使用单独的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来测试这个)
答案 0 :(得分:1)
您不需要多个WebSecurityConfigurerAdapter
;只需配置过滤器,使它们仅用于匹配URL模式。换句话说,添加所有过滤器,但使过滤器有条件地起作用。