Spring Security OAuth2: как добавить несколько цепочек фильтров безопасности типа ResourceServerConfigurer? - PullRequest
0 голосов
/ 02 января 2019

Я установил мультимодульное приложение Spring Boot (5 модулей) с Spring Security OAuth2.Все работает хорошо, но по мере роста приложения я хочу разделить часть безопасности в каждом модуле.Основной модуль включает все:

@SpringBootApplication
@EnableResourceServer
@EnableAuthorizationServer
@EnableWebSecurity(debug = true)
public class Application {  
  ...
}

Теперь в каждом модуле я определил бин типа ResourceServerConfigurer

@Configuration
@Order(2)
public class Module1SecurityFilterChain extends ResourceServerConfigurerAdapter {

   @Override
   public void configure( HttpSecurity http ) throws Exception {
      http.sessionManagement().sessionCreationPolicy( STATELESS );
      http.antMatcher( "/module1/**")
            .authorizeRequests()
            .antMatchers( "/module1/resource").authenticated()
            .antMatchers( "/module1/test" ).authenticated()
            .anyRequest().access( "#oauth2.hasScope('webclient')" );
   }
}

То же самое с модулем 2:

@Configuration
@Order(1)
public class Module2SecurityFilterChain extends ResourceServerConfigurerAdapter {

   @Override
   public void configure( HttpSecurity http ) throws Exception {
      http.sessionManagement().sessionCreationPolicy( STATELESS );
      http.antMatcher( "/module2/**")
            .authorizeRequests()
            .antMatchers( "/module2/resource").authenticated()
            .antMatchers( "/module2/test" ).authenticated()
            .anyRequest().access( "#oauth2.hasScope('webclient')" );
   }
}

И так далее ...

Проблема в том, что зарегистрирована только одна FilterChain, из которых @Order(2).Я взглянул на doc из ResourceServerConfigurer и там говорится:

... если более одного настраивают одну и ту же преоперту, тогда выигрывает последняя.Конфигураторы отсортированы по Порядку перед применением

Как я могу обойти это ограничение?Большое спасибо.

РЕДАКТИРОВАТЬ

Выполнение этого (расширение WebSecurityConfigurerAdapter вместо ResourceServerConfigurerAdapter):

@Configuration
@Order(1)
public class Module2SecurityFilterChain extends WebSecurityConfigurerAdapter {...}

, кажется, регистрируетцепочка фильтров, но есть другая проблема: когда я аутентифицирую пользователя (получаю токен на /oauth/token), я не могу получить доступ к ресурсу, защищенному этой цепочкой, я получаю 403 Forbidden.Как работает этот черный ящик?

1 Ответ

0 голосов
/ 02 января 2019

Вы можете настроить несколько совпадений, используя несколько бинов, используя requestMatchers().antMatchers(String...), например:

@Configuration
public class Module2SecurityFilterChain extends ResourceServerConfigurerAdapter {

   @Override
   public void configure(HttpSecurity http) throws Exception {
       http
           .requestMatchers()
               .antMatchers("/module2/**")
           .authorizeRequests()
               .antMatchers("/module2/resource").authenticated()
               .antMatchers("/module2/test").authenticated()
               .anyRequest().access("#oauth2.hasScope('webclient')");
   }
}

Это немного сбивает с толку, но когда вы звоните http.antMatcher(String), это говорит о том, что вы хотите сопоставитьтолько против этой единственной конечной точки.Таким образом, вызывая его дважды (один раз в Module1SecurityFilterChain, а затем снова в Module2SecurityFilterChain), второй вызов отменяет первый.

Однако использование http.requestMatchers().antMatchers(String) означает, что данный String должен быть добавлен ксуществующий список конечных точек уже сопоставляется.Вы можете думать о antMatcher как "setMatcher" и antMatchers как "appendMatcher".

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