Spring Cloud Gateway + сервер ресурсов безопасности Spring - PullRequest
1 голос
/ 30 апреля 2020

Я бы на самом деле не поставил бы это здесь, но я действительно запутался, я хочу добиться следующего.

Я бегу

  • Java 14
  • Spring Cloud Gateway версия: Hoxton.SR3
  • Spring Boot версия: 2.2.5.RELEASE

Теперь я хочу интегрировать безопасность в мой шлюз и все последующие микросервисы. В конце концов я решил go с Firebase в качестве провайдера идентификации (IDP). Мое приложение Angular будет получать токен JWT от Firebase и отправлять его при каждом запросе в Cloud Gateway. Итак, шлюз начнет действовать ТОЛЬКО как сервер ресурсов, и на этом все.

Вот как я пытался дать ему go. Настройте и Spring Cloud Gateway для работы в качестве сервера ресурсов одновременно. Очень хорошо объяснено здесь Spring Security Docs .

Вот как выглядит моя конфигурация

@EnableWebFluxSecurity
public class ResourceServerSecurityConfiguration {

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
    // @formatter:off
    http
        .authorizeExchange()
        .anyExchange().authenticated()
        .and()
        .oauth2ResourceServer()
        .jwt();
    return http.build();
    // @formatter:on
  }
}

И application.yml

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com
          issuer-uri: https://securetoken.google.com/{$app.name}

Как вы см. в этом YAML я предоставил jwk-set-uri и эмитент для проверки входящих токенов.

На данный момент все работает вполне так, как принято. Все запросы должны иметь действительный JWT в заголовке аутентификации.

Далее

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

Вот как я пытаюсь настроить мой клиент.

  @Bean
  @LoadBalanced
  public WebClient.Builder loadBalancedWebClientBuilder() {
    return WebClient.builder()
        .filter(new ServletBearerExchangeFilterFunction());
  }

Как вы видите, он использует ServletBearerExchangeFilterFunction, вот тут и возникает моя настоящая проблема.

Я уже проверял это когда Spring настраивает oauth2ResourceServer, который он использует NoOpServerSecurityContextRepository. Из того, что я до сих пор понимаю, что это именно тот репозиторий, который используется для регистрации контекста на запрос. Кроме того, я понимаю, что имеет смысл использовать N oOp, поскольку мы хотим быть лицами без состояния. Однако то, что я не понимаю, как заставить ServletBearerExchangeFilterFunction работать должным образом и передавать мои токены вниз по течению.

Сейчас я провожу довольно много времени, пытаясь найти правильный способ сделать это.

Обнаружил это: Spring Boot 2 OID C (OAuth2) клиент / ресурс сервер, не распространяющий токен доступа в WebClient

Github: https://github.com/spring-projects/spring-security/issues/7771

И даже в соответствии с этим то, что я пытаюсь сделать, должно быть оставлено git и возможно. Не уверен, где я ошибаюсь.

...