Spring несколько методов аутентификации для разных конечных точек API - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу проверить разные методы аутентификации для разных конечных точек.Методы, которые я хочу использовать: 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 / транзакция / testf конечная точка для сертификата x509 и позволяет всем остальным конечным точкам отвечать.Мне нужны другие конечные точки для возврата 503 без токена jwt.

1 Ответ

0 голосов
/ 18 февраля 2019

У вас есть две цепочки фильтров.Ни у одного из них нет правильно настроенного шаблона точки входа 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 basic-authаутентификация возможна только через одну конечную точку

...