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://localhost:9000"))
            .filter(tokenRelay())
            .build();
    }
}

或者使用此方式

application.yaml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: resource
          uri: http://localhost: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 实现。