Как настроить другой фильтр аутентификации по шаблону URL? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть приложение с загрузочной пружиной, которое предоставляет в основном конечные точки REST, авторизация с JWT.Я хочу использовать JWT с secret1 для аутентификации / internal_api / ** API и JWT с secret2 для других.Я не знаю, как настроить для этой сцены.Нужно ли два класса SecurityConfig для настройки?

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig : WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity) {
        http.csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .antMatchers("/internal_api/**")
                .addFilterAt(JwtTokenAuthFilter("secret1"), UsernamePasswordAuthenticationFilter::class.java)
                .authorizeRequests()
                .anyRequest().permitAll()
    }
}

Я ожидаю, что пользователь с JWT (secret1) может получить доступ к / internal_api / ** (через JwtTokenAuthFilter ("secret1")) и использовать с JWT (secret2) может получить доступ/ other_resource / ** (через JwtTokenAuthFilter ("secret2")

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Благодаря этим дням онлайн-поиска, я наконец нашел лучшую реализацию.

Согласно весне официальный документ рекомендуемый метод.

Создание и настройка цепочек фильтров Раздел:

Многие приложения имеют совершенно разные правила доступа для одного набора ресурсов по сравнению с другим. Например, приложение, в котором размещен пользовательский интерфейс и API поддержки, может поддерживать проверку подлинности на основе файлов cookie с перенаправлением на страницу входа для частей пользовательского интерфейса и проверку подлинности на основе токенов с ответом 401 на запросы без проверки подлинности для частей API. Каждый набор ресурсов имеет свой собственный WebSecurityConfigurerAdapter с уникальным порядком и собственным сопоставителем запросов. Если соответствующие правила перекрывают друг друга, выиграет самая ранняя упорядоченная цепочка фильтров.

class  SecurityConfig {
  @Configuration
  @Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
  class InternalApiConfig: WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity) {
        http.antMatcher("/internal_api/**")
        http.authorizeRequests()
               .antMatchers("/internal_api/**").authenticated()
        http.addFilterAt(JwtTokenAuthFilter("secret1"), UsernamePasswordAuthenticationFilter::class.java)
    }
  }

  @Configuration
  @Order(SecurityProperties.BASIC_AUTH_ORDER - 9)
  class ApiConfig : WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity) {
        http.authorizeRequests()
               .antMatchers("/other_resource/**").authenticated()

        http.addFilterAt(JwtTokenAuthFilter("secret2"), UsernamePasswordAuthenticationFilter::class.java)

    }
  }
}
0 голосов
/ 06 июня 2019

Вы можете просто использовать тот же JwtTokenAuthFilter.Дело в том, что вы должны решить, какие роли или полномочия должны иметь пользователь для доступа к этим конечным точкам.Затем во время аутентификации JWT в JwtTokenAuthFilter вы определяете, имеют ли текущий запрошенный пользователь эти роли.Если да, убедитесь, что объекту пользователя, установленному в SecurityContext, назначены эти роли.

Предположим, /internal_api/** требует ROLE_INTERNAL для доступа, в то время как /other_resource/** требует ROLE_OTHER для доступа.Конфигурация выглядит так:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/internal_api/**").hasRole("INTERNAL")
        .antMatchers("/other_resource/**").hasRole("OTHER")
         //blablbabla.....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...