Как поддерживать базовую аутентификацию и аутентификацию носителя для проекта REST API

Я новичок в Spring Security и все еще изучаю его, поэтому мой вопрос может быть наивным, пожалуйста, потерпите его.

У меня есть проект Sprint Boot Rest API, который предоставляет определенные API. Я уже реализовал аутентификацию на основе токенов-носителей для всех API. например /user , /resource, /appointment

Теперь для нескольких API для конкретного контроллера я хотел бы реализовать базовую аутентификацию. Эти API будут использоваться другой службой, которая не является общедоступной. Чтобы обеспечить безопасность API-интерфейсов, я хотел бы иметь базовую аутентификацию для этих API-интерфейсов. например /internal/api1 , internal/api2 .. и т.д.

Я не могу различить URL-адреса в ResourceServerConfigurerAdapter и WebSecurityConfigurerAdapter. Также не уверен, что следует использовать для добавления basicAuth() с помощью antmatchers


comment
Я не уверен, как вы реализовали SecurityConfiguration, но, возможно, этот вопрос вам поможет — заголовок stackoverflow.com/questions/47627226/   -  person Sai Upadhyayula    schedule 27.05.2020


Ответы (1)


Что вы хотите, прочитав вашу проблему, так это иметь два типа аутентификации (токен и httpBasic) для двух разных конечных точек. Этого можно добиться, создав два разных bean-компонента WebSecurityConfigurerAdapter. Spring Boot позволяет это сделать, как показано ниже:

  • @Order(1) - /resource|user|appointment/** защищен аутентификацией токена-носителя.
  • @Order(2) - /internal/** защищен базовой аутентификацией.

Просмотрите документы для Spring Boot и пример кода здесь.

   @EnableWebSecurity
   public class SecurityConfig {

    @Configuration
    @Order(1)
    public class ApiSecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/resource/**")
                .antMatcher("/user/**")
                .antMatcher("/appointment/**")
                .authorizeRequests()
                    .anyRequest().authenticated()
                .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and().addFilterBefore(jwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
        }
    }

    @Configuration
    @Order(2)
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/internal/**")
                .and()
                .httpBasic();
        }
    }

}
person Fausto Carvalho Marques Silva    schedule 28.05.2020
comment
пожалуйста, если ответ отвечает вашей проблеме, примите его. Спасибо - person Fausto Carvalho Marques Silva; 31.05.2020
comment
Я попробовал вышеуказанный подход. Но это не сработало в моем случае. У меня есть собственный класс, расширяющий ResourceServerConfigurerAdapter, в котором я переопределяю configure (HttpSecurity http), чтобы обойти безопасность для некоторых общедоступных URL-адресов. Поэтому, если я не укажу здесь URL-адрес, для которого я хочу базовую аутентификацию, тогда он скажет, что недопустимый токен jwt, но если я укажу URL-адрес здесь в настройке (HttpSecurity http), тогда он будет успешно выполнен без какой-либо аутентификации. - person nishi; 02.06.2020