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.