Spring несколько методов аутентификации для разных конечных точек API

Я хочу проверить разные методы аутентификации для разных конечных точек. Я хочу использовать методы x509 и jwt. Мне нужно использовать Только x509 для определенной конечной точки и использовать JWT для всех остальных запросов.

Вот моя конфигурация веб-безопасности:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                .antMatchers("/api/transaction/testf").authenticated().and()
                .x509()
                .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
                .userDetailsService(new X509UserDetailsService())
                ;
        }
    }

    @Configuration
    @Order(2)
    public static class ApiTokenSecurityConfig extends WebSecurityConfigurerAdapter{

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                .antMatchers("/oauth/token", "/api/dealer/login").permitAll()
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                ;
        }

    }
}

Эта конфигурация проверяет только конечную точку /API/транзакция/тестф на наличие сертификата x509 и позволяет всем остальным конечным точкам отвечать. Мне нужно, чтобы другие конечные точки возвращали 503 без токена jwt.

Для каждой цепочки фильтров необходимо указать шаблон муравья для этой цепочки. http.antMatcher (не http.authorizeRequests как первый вызов) Этот пост описывает, что вам нужно: stackoverflow.com/questions/54657163/…

Filip Hanik VMware 15.02.2019 20:32
14
1
5 234
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть две цепочки фильтров. Ни у одного из них нет правильно настроенного паттерна точки входа http.antMatcher. Это означает, что они настроены на использование /** в качестве шаблона точки входа.

Например

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().fullyAuthenticated()

это то же самое, что сказать:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/**")
            .authorizeRequests()
                .anyRequest().fullyAuthenticated()

То, что мы говорим здесь,

  1. http - цепочка фильтров безопасности
  2. http.antMatcher - точка входа в цепочку фильтров безопасности
  3. http.authorizeRequests - начало ограничения доступа к моей конечной точке
  4. http.authorizeRequests.antMatchers - список URL-адресов с определенным доступом

Итак, что вам нужно сделать, это изменить цепочку фильтров @Order(1), чтобы сузить шаблон. Например: http.antMatcher("/api/transaction/**")

Теперь ваша конфигурация будет выглядеть


    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/api/transaction/**") //customized entry point
                .authorizeRequests()
                .antMatchers("/api/transaction/testf").authenticated().and()
                .x509()
                .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
                .userDetailsService(new X509UserDetailsService())
                ;
        }
    }

    @Configuration
    @Order(2)
    public static class ApiTokenSecurityConfig extends WebSecurityConfigurerAdapter{

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/**") //this is default
                .authorizeRequests()
                .antMatchers("/oauth/token", "/api/dealer/login").permitAll()
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                ;
        }

С вашей существующей конфигурацией цепочка фильтров с именем ApiWebSecurityConfig будет перехватывать все вызовы. Другая цепочка фильтров, ApiTokenSecurityConfig, никогда не используется.

Вы можете увидеть другое описание в этом отвечать

SpringSecurity: сделайте аутентификацию базовой аутентификации RESTful API возможной только через одну конечную точку.

Другие вопросы по теме