Spring security - 创建 2 个具有特定匹配器的过滤器链
Spring security - create 2 filter chains with specific matchers
我正在实施对现有 spring 项目的 ADFS 支持。
因为我们已经有了自己的 JWT 身份验证,我们希望它与 ADFS 身份验证并行工作,所以我想实现一个新的过滤器链,它只处理某些 API 请求路径。
我的意思是我想创建:
- 将处理所有 /adfs/saml/** API 调用的 ADFS 过滤器链
- 保留将处理所有其余 API 调用的默认过滤器链
我正在使用定义过滤器链的 ADFS spring security lib:
public abstract class SAMLWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
//some code
protected final HttpSecurity samlizedConfig(final HttpSecurity http) throws Exception {
http.httpBasic().authenticationEntryPoint(samlEntryPoint())
.and()
.csrf().ignoringAntMatchers("/saml/**")
.and()
.authorizeRequests().antMatchers("/saml/**").permitAll()
.and()
.addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class)
.addFilterAfter(filterChainProxy(), BasicAuthenticationFilter.class);
// store CSRF token in cookie
if (samlConfigBean().getStoreCsrfTokenInCookie()) {
http.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
return http;
}
}
然后我扩展这个 class:
@EnableWebSecurity
@Configuration
@Order(15)
@RequiredArgsConstructor
public class ADFSSecurityConfiguration extends SAMLWebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
samlizedConfig(http)
.authorizeRequests()
.antMatchers("/adfs")
.authenticated();
}
}
但是在调试时我看到这个新的过滤器链被设置为匹配“任何”请求。
所以我可能把匹配器设置错了。
实际上,在阅读 official docs 之后,答案很简单:
(请参阅“创建和自定义过滤器链”部分)
@Override
protected void configure(final HttpSecurity http) throws Exception {
samlizedConfig(http)
.antMatcher("/adfs/**");
}
它不应该放在 .authorizeRequests()
之后,而是放在第一个匹配器上。
我正在实施对现有 spring 项目的 ADFS 支持。 因为我们已经有了自己的 JWT 身份验证,我们希望它与 ADFS 身份验证并行工作,所以我想实现一个新的过滤器链,它只处理某些 API 请求路径。 我的意思是我想创建:
- 将处理所有 /adfs/saml/** API 调用的 ADFS 过滤器链
- 保留将处理所有其余 API 调用的默认过滤器链
我正在使用定义过滤器链的 ADFS spring security lib:
public abstract class SAMLWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
//some code
protected final HttpSecurity samlizedConfig(final HttpSecurity http) throws Exception {
http.httpBasic().authenticationEntryPoint(samlEntryPoint())
.and()
.csrf().ignoringAntMatchers("/saml/**")
.and()
.authorizeRequests().antMatchers("/saml/**").permitAll()
.and()
.addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class)
.addFilterAfter(filterChainProxy(), BasicAuthenticationFilter.class);
// store CSRF token in cookie
if (samlConfigBean().getStoreCsrfTokenInCookie()) {
http.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
return http;
}
}
然后我扩展这个 class:
@EnableWebSecurity
@Configuration
@Order(15)
@RequiredArgsConstructor
public class ADFSSecurityConfiguration extends SAMLWebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
samlizedConfig(http)
.authorizeRequests()
.antMatchers("/adfs")
.authenticated();
}
}
但是在调试时我看到这个新的过滤器链被设置为匹配“任何”请求。 所以我可能把匹配器设置错了。
实际上,在阅读 official docs 之后,答案很简单: (请参阅“创建和自定义过滤器链”部分)
@Override
protected void configure(final HttpSecurity http) throws Exception {
samlizedConfig(http)
.antMatcher("/adfs/**");
}
它不应该放在 .authorizeRequests()
之后,而是放在第一个匹配器上。