TokenRelay GatewayFilter 工廠

令牌中繼是指 OAuth2 消費者充當客戶端,並將傳入的令牌轉發到傳出的資源請求。消費者可以是純客戶端(如 SSO 應用程式)或資源伺服器。

Spring Cloud Gateway 可以使用 TokenRelay GatewayFilter 將 OAuth2 訪問令牌下游轉發到其代理的服務。

TokenRelay GatewayFilter 接受一個可選引數 clientRegistrationId。以下示例配置了一個 TokenRelay GatewayFilter

App.java
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("resource", r -> r.path("/resource")
                    .filters(f -> f.tokenRelay("myregistrationid"))
                    .uri("https://:9000"))
            .build();
}

或此

application.yaml
spring:
  cloud:
    gateway:
      routes:
      - id: resource
        uri: https://:9000
        predicates:
        - Path=/resource
        filters:
        - TokenRelay=myregistrationid

上面的示例指定了一個 clientRegistrationId,它可用於獲取並轉發任何可用 ClientRegistration 的 OAuth2 訪問令牌。

Spring Cloud Gateway 還可以轉發當前已認證使用者的 OAuth2 訪問令牌 oauth2Login() 用於認證使用者。要將此功能新增到閘道器,您可以省略 clientRegistrationId 引數,如下所示

App.java
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("resource", r -> r.path("/resource")
                    .filters(f -> f.tokenRelay())
                    .uri("https://:9000"))
            .build();
}

或此

application.yaml
spring:
  cloud:
    gateway:
      routes:
      - id: resource
        uri: https://:9000
        predicates:
        - Path=/resource
        filters:
        - TokenRelay=

它將(除了登入使用者並獲取令牌之外)將認證令牌下游傳遞給服務(在本例中為 /resource)。

要為 Spring Cloud Gateway 啟用此功能,請新增以下依賴項

  • org.springframework.boot:spring-boot-starter-oauth2-client

它是如何工作的?過濾器 從當前已認證使用者中提取給定 clientRegistrationId 的 OAuth2 訪問令牌。如果未提供 clientRegistrationId,則使用當前已認證使用者自己的訪問令牌(在登入期間獲取)。在任何一種情況下,提取的訪問令牌都會放置在下游請求的請求頭中。

有關完整的工作示例,請參見此專案

只有設定了適當的 spring.security.oauth2.client.* 屬性(這將觸發 ReactiveClientRegistrationRepository bean 的建立)時,才會建立 TokenRelayGatewayFilterFactory bean。
TokenRelayGatewayFilterFactory 使用的 ReactiveOAuth2AuthorizedClientService 的預設實現使用記憶體資料儲存。如果您需要更強大的解決方案,則需要提供自己的 ReactiveOAuth2AuthorizedClientService 實現。
© . This site is unofficial and not affiliated with VMware.