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