Несколько типов аутентификации в Webflux - PullRequest
0 голосов
/ 15 марта 2020

У нас есть служба API, которая имеет несколько открытых API, и есть несколько персон, которые / которые могут получить доступ к нашей службе.

  1. Пользователи - кому нужна учетная запись в нашей системе -> необходимо пройти проверку подлинности с помощью нашей службы Identity Provider Service (Keycloak) с токеном JWT.
  2. Регулируемая система - которая должна быть заверенным с центральной властью, поддерживаемой некоторой стороной.
  3. Внутренняя служба для связи службы -> аутентификация с использованием того же Keycloak.
  4. Временный токен JWT, выданный той же службой перед созданием учетной записи пользователя, когда пользователь в цифровой форме подтвердил номер мобильного телефона.

Я пытался получить AuthenticationWebFilter для Для каждого типа проверки подлинности и настройки с помощью Pathmatchers, хотя проверка подлинности выполнялась правильным веб-фильтром проверки подлинности, запрос продолжает проходить через другой фильтр проверки подлинности, и в результате получается unauthorized.

Фрагмент конфигурации:

public class Configuration {
    @Bean
    @Order(1)
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity httpSecurity,
                                                         @Qualifier("userCreationFilter")
                                                                 AuthenticationWebFilter userCreationFilter) {
        final String[] WHITELISTED_URLS = {"/**.json",
                                           "/users/verify",
                                           "/users/permit",
                                           "/sessions",
                                           "/internal/xxxxx/**",
                                           "/**.html",
                                           "/**.js",
                                           "/**.yaml",
                                           "/**.css",
                                           "/**.png"};
        httpSecurity.authorizeExchange().pathMatchers(WHITELISTED_URLS).permitAll();
        httpSecurity.addFilterBefore(userCreationFilter, SecurityWebFiltersOrder.AUTHENTICATION)
                .authorizeExchange()
                .pathMatchers("/users")
                .authenticated();
        httpSecurity.httpBasic().disable().formLogin().disable().csrf().disable().logout().disable();
        return httpSecurity.build();
    }

    @Bean
    @Order(2)
    public SecurityWebFilterChain securityWebFilterChain2(ServerHttpSecurity httpSecurity,
                                                          @Qualifier("managerFilter")
                                                                  AuthenticationWebFilter managerFilter) {
        httpSecurity.addFilterBefore(managerFilter, SecurityWebFiltersOrder.AUTHENTICATION)
                .authorizeExchange()
                .pathMatchers("/xxxxx/**",
                        "/providers",
                        "/xxxxx/**/approve",
                        "/xxxx/**/xxxxx").authenticated();
        return httpSecurity.build();
    }
}

Сейчас у нас нет ролей как таковых.

Я попытался сохранить всю конфигурацию в одном компоненте SecurityWebFilterChain и попытался добавить addWebFilterAt, но безуспешно.

Чего мне не хватает? Должен ли я сделать это по-другому?

...