Можно ли установить два пользовательских WebSecurityConfigurerProvider
s, чтобы аутентифицировать большинство конечных точек с одной, а некоторые запросы с обеими?
Я хочу, чтобы все конечные точки имели правильный заголовок API-ключа, поэтому яиметь этот класс конфигурации:
@Configuration
@EnableWebSecurity
@Order(1)
public class FirstLevelSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
AuthFilter authFilter = new AuthFilter(principalRequestHeader);
authFilter.setAuthenticationManager(new AuthenticationManager() {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if (!someCondition()) {
throw new BadCredentialsException("The API key was not found or not the expected value.");
}
authentication.setAuthenticated(true);
return authentication;
}
});
httpSecurity
.csrf().disable()
.addFilter(authFilter).authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers(HttpMethod.GET, "/**").authenticated()
.antMatchers(HttpMethod.POST, "/**").authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
@Bean
public FilterRegistrationBean corsFilter() {
// cors
}
}
Но некоторые определенные конечные точки должны дополнительно иметь второй правильный заголовок, поэтому я написал второй класс с аннотацией @Order(2)
, надеясь, что она будет работать:
@Configuration
@EnableWebSecurity
@Order(2)
public class SecondLevelSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
AuthFilter authFilter = new AuthFilter(principalRequestHeader);
authFilter.setAuthenticationManager(new AuthenticationManager() {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if (!someOtherCondition()) {
throw new BadCredentialsException("The API key was not found or not the expected value.");
}
authentication.setAuthenticated(true);
return authentication;
}
});
httpSecurity
.csrf().disable()
.addFilter(authFilter).authorizeRequests()
.antMatchers(HttpMethod.POST, "/certainEndpoint").authenticated();
}
}
Проблема в том, что второй конфиг, кажется, зарегистрирован правильно, но его метод authentication
никогда не вызывается.Я что-то здесь упускаю?