TokenRelay Filter

令牌中继是指 OAuth2 消费者充当客户端,并将传入令牌转发到传出资源请求的位置。消费者可以是纯客户端(如 SSO 应用程序)或资源服务器。

Spring Cloud Gateway Server MVC 可以转发当前经过身份验证用户的 OAuth2 访问令牌,oauth2Login() 用于对用户进行身份验证。

RouteConfiguration.java
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> gatewayRouterFunctionsAddReqHeader() {
		return route("resource")
			.GET("/resource", http("http://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

它如何工作?当前经过身份验证用户的自己的访问令牌(在登录期间获取)被使用,并且提取的访问令牌被放置在下游请求的请求标头中。

Token Relay 过滤器仅在设置了正确的 spring.security.oauth2.client.* 属性时才会工作,这将触发 OAuth2AuthorizedClientManager bean 的创建。

Token Relay 过滤器使用的默认实现使用内存数据存储。如果你需要一个更健壮的解决方案,则需要提供自己的实现 OAuth2AuthorizedClientService