Я бы на самом деле не поставил бы это здесь, но я действительно запутался, я хочу добиться следующего.
Я бегу
- 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 и возможно. Не уверен, где я ошибаюсь.