TokenRelay 過濾器
令牌中繼是指 OAuth2 消費者作為客戶端,將傳入的令牌轉發到傳出的資源請求。消費者可以是純客戶端(如 SSO 應用程式)或資源伺服器。
Spring Cloud Gateway Server MVC 可以使用 TokenRelay 過濾器將 OAuth2 訪問令牌下游轉發到其代理的服務。
TokenRelay 過濾器接受一個可選引數 clientRegistrationId。以下示例配置了一個 TokenRelay 過濾器
RouteConfiguration.java
@Configuration
class RouteConfiguration {
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctionsTokenRelay() {
return route("resource")
.GET("/resource", http())
.before(uri("https://:9000"))
.filter(tokenRelay("myregistrationid"))
.build();
}
}
或此
application.yaml
spring:
cloud:
gateway:
routes:
- id: resource
uri: https://:9000
predicates:
- Path=/resource
filters:
- TokenRelay=myregistrationid
上述示例指定了一個 clientRegistrationId,可用於獲取並轉發任何可用 ClientRegistration 的 OAuth2 訪問令牌。
Spring Cloud Gateway Server MVC 可以轉發當前已認證使用者的 OAuth2 訪問令牌,該令牌透過 oauth2Login() 進行使用者認證。要將此功能新增到閘道器,可以省略 clientRegistrationId 引數,如下所示
RouteConfiguration.java
@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
它是如何工作的?該過濾器從當前已認證使用者中提取指定 clientRegistrationId 的 OAuth2 訪問令牌。如果未提供 clientRegistrationId,則使用當前已認證使用者自己的訪問令牌(在登入期間獲得),並將提取的訪問令牌放置在下游請求的請求頭中。
令牌中繼過濾器僅在設定了適當的 spring.security.oauth2.client.* 屬性時才起作用,這些屬性將觸發 OAuth2AuthorizedClientManager bean 的建立。 |
令牌中繼過濾器使用的預設實現採用記憶體資料儲存。如果您需要更可靠的解決方案,則需要提供自己的 OAuth2AuthorizedClientService 實現。 |