TokenRelay 過濾器

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

Spring Cloud Gateway Server MVC 可以轉發當前已認證使用者的 OAuth2 訪問令牌,使用 oauth2Login() 來認證使用者。

RouteConfiguration.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
import static org.springframework.cloud.gateway.server.mvc.filter.TokenRelayFilterFunctions.tokenRelay;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsTokenRelay() {
        return route("resource")
            .GET("/resource", http())
            .before(uri("https://:9000"))
            .filter(tokenRelay())
            .build();
    }
}

或者使用此方式

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

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

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

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

它是如何工作的?使用當前已認證使用者自己的訪問令牌(在登入期間獲得),並將提取的訪問令牌放在下游請求的請求頭中。

只有設定了適當的 spring.security.oauth2.client.* 屬性,並觸發建立 OAuth2AuthorizedClientManager bean 時,Token Relay 過濾器才會起作用。
Token Relay 過濾器使用的預設實現使用記憶體資料儲存。如果您需要更健壯的解決方案,則需要提供自己的 OAuth2AuthorizedClientService 實現。