Два WebSecurityConfigurerProviders для уровня двухуровневой аутентификации - PullRequest
0 голосов
/ 05 февраля 2019

Можно ли установить два пользовательских 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 никогда не вызывается.Я что-то здесь упускаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...