更多详情
单点登录
所有 OAuth2 SSO 和资源服务器功能都已移至 Spring Boot 在 1.3 版本中。您可以在 Spring Boot 用户指南中找到文档。 |
Token Relay
令牌中继是 OAuth2 使用者充当客户端的地方,而 将传入令牌转发到传出资源请求。这 consumer 可以是纯 Client(如 SSO 应用程序)或 Resource 服务器。
Spring Cloud 网关中的客户端令牌中继
如果您的应用程序还具有 Spring Cloud Gateway 嵌入式反向代理,那么您 可以要求它将 OAuth2 访问令牌转发到下游服务 它是代理。因此,上面的 SSO 应用程序可以简单地增强,就像 这:
@Autowired
private TokenRelayGatewayFilterFactory filterFactory;
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("resource", r -> r.path("/resource")
.filters(f -> f.filter(filterFactory.apply()))
.uri("http://localhost:9000"))
.build();
}
或者这个
spring:
cloud:
gateway:
routes:
- id: resource
uri: http://localhost:9000
predicates:
- Path=/resource
filters:
- TokenRelay=
它会(除了登录用户和获取令牌之外)
将身份验证令牌下游传递给服务(在本例中为/resource
).
要为 Spring Cloud 网关启用此功能,请添加以下依赖项
-
org.springframework.boot:spring-boot-starter-oauth2-client
-
org.springframework.cloud:spring-cloud-starter-security
它是如何工作的?过滤器从当前经过身份验证的用户中提取访问令牌 并将其放入下游请求的请求标头中。
有关完整的工作示例,请参阅此项目。
的默认实现ReactiveOAuth2AuthorizedClientService 使用者TokenRelayGatewayFilterFactory 使用内存中数据存储。您需要提供自己的实施ReactiveOAuth2AuthorizedClientService 如果您需要更强大的解决方案。 |
客户端令牌中继
如果您的应用程序是面向用户的 OAuth2 客户端(即已声明@EnableOAuth2Sso
或@EnableOAuth2Client
),则它有一个OAuth2ClientContext
在 Spring Boot 的请求范围内。您可以
创建您自己的OAuth2RestTemplate
从这个上下文中,一个
自动接线OAuth2ProtectedResourceDetails
,然后上下文将
始终将访问令牌转发到下游,同时刷新访问权限
令牌。(这些是 Spring 的功能
Security 和 Spring Boot 的 Boot。
Spring Boot (1.4.1) 不会创建OAuth2ProtectedResourceDetails 如果你正在使用client_credentials 令 牌。在这种情况下,您需要创建自己的ClientCredentialsResourceDetails 并使用@ConfigurationProperties("security.oauth2.client") . |
Zuul 代理中的客户端令牌中继
如果您的应用程序还具有 Spring
Cloud Zuul 嵌入式反向代理(使用@EnableZuulProxy
),那么您
可以要求它将 OAuth2 访问令牌转发到下游服务
它是代理。因此,上面的 SSO 应用程序可以简单地增强,就像
这:
@Controller
@EnableOAuth2Sso
@EnableZuulProxy
class Application {
}
它会(除了登录用户和获取令牌之外)
将身份验证令牌下游传递给/proxy/*
服务业。如果这些服务是通过@EnableResourceServer
然后,他们将在
正确的标题。
它是如何工作的?这@EnableOAuth2Sso
注释拉入spring-cloud-starter-security
(您可以在
traditional 应用程序),这反过来又会触发一些
一个ZuulFilter
,它本身被激活,因为 Zuul 位于
classpath (通过@EnableZuulProxy
).过滤器只是从当前经过身份验证的用户中提取访问令牌
并将其放入下游请求的请求标头中。
Spring Boot 不会创建OAuth2RestOperations automatically 需要refresh_token .在这种情况下,您需要创建自己的OAuth2RestOperations 所以OAuth2TokenRelayFilter 如果需要,可以刷新令牌。 |
资源服务器令牌中继
如果您的应用具有@EnableResourceServer
您可能希望中继
传入令牌下游到其他服务。如果您使用RestTemplate
要联系下游服务,那么这只是一个
如何创建具有正确上下文的模板的问题。
如果您的服务使用UserInfoTokenServices
对传入进行身份验证
令牌(即它使用security.oauth2.user-info-uri
configuration),那么您只需创建一个OAuth2RestTemplate
使用 AutowiredOAuth2ClientContext
(它将由
authentication 进程)。等效
(在 Spring Boot 1.4 中),您可以注入UserInfoRestTemplateFactory
并抓住它OAuth2RestTemplate
在
您的配置。例如:
@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
return factory.getUserInfoRestTemplate();
}
然后,此 rest 模板将具有相同的OAuth2ClientContext
(request-scoped) 的 Zip S Packaged),因此您可以
使用它来发送具有相同访问令牌的请求。
如果您的应用程序未使用UserInfoTokenServices
但仍然是客户
(即它声明@EnableOAuth2Client
或@EnableOAuth2Sso
),然后
使用 Spring Security Cloud anyOAuth2RestOperations
用户
从@Autowired
OAuth2Context
也会转发
令 牌。默认情况下,此功能作为 MVC 处理程序实现
interceptor 中,因此它只能在 Spring MVC 中工作。如果您未使用 MVC
您可以使用自定义过滤器或 AOP 拦截器将AccessTokenContextRelay
来提供相同的功能。
下面是一个基本的 显示使用已创建的自动装配 REST 模板的示例 elsewhere (“foo.com” 是接受与 周围的应用程序):
@Autowired
private OAuth2RestOperations restTemplate;
@RequestMapping("/relay")
public String relay() {
ResponseEntity<String> response =
restTemplate.getForEntity("https://foo.com/bar", String.class);
return "Success! (" + response.getBody() + ")";
}
如果您不想转发令牌(这是有效的
选择,因为您可能希望扮演您自己,而不是
客户端)的 Token,则您只需创建自己的OAuth2Context
而不是自动装配默认的。
假客户端还将获取一个使用OAuth2ClientContext
如果可用,则他们还应执行
token 中继到任何位置RestTemplate
愿意。