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 实现。 |