更多详情

单点登录

所有 OAuth2 SSO 和资源服务器功能都移至 Spring Boot 在 1.3 版本中。您可以在 Spring Boot 用户指南中找到文档。

Tokens中继

Tokens中继是 OAuth2 消费者充当客户端和 将传入Tokens转发到传出资源请求。这 consumer 可以是纯客户端(如 SSO 应用程序)或资源 服务器。spring-doc.cadn.net.cn

Spring Cloud Gateway 中的客户端Tokens中继

如果您的应用也有 Spring Cloud Gateway 嵌入式反向代理,然后您 可以要求它将 OAuth2 访问Tokens向下游转发到服务 它是代理的。因此,上面的 SSO 应用程序可以简单地进行增强,例如 这:spring-doc.cadn.net.cn

App.java
@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();
}
应用程序.yaml
spring:
  cloud:
    gateway:
      routes:
      - id: resource
        uri: http://localhost:9000
        predicates:
        - Path=/resource
        filters:
        - TokenRelay=

它会(除了登录用户并获取Tokens之外) 将身份验证Tokens下游传递给服务(在本例中/resource).spring-doc.cadn.net.cn

要为 Spring Cloud Gateway 启用此功能,请添加以下依赖项spring-doc.cadn.net.cn

它是如何工作的?筛选从当前经过身份验证的用户 并将其放在下游请求的请求头中。spring-doc.cadn.net.cn

有关完整的工作示例,请参阅此项目spring-doc.cadn.net.cn

默认实现ReactiveOAuth2AuthorizedClientService使用者TokenRelayGatewayFilterFactory使用内存中数据存储。您需要提供自己的实现ReactiveOAuth2AuthorizedClientService如果您需要更强大的解决方案。

客户端Tokens中继

如果您的应用是面向 OAuth2 客户端的用户(即已声明@EnableOAuth2Sso@EnableOAuth2Client),则它有一个OAuth2ClientContext在 Spring Boot 的请求范围内。您可以 创建您自己的OAuth2RestTemplate从这个上下文和 自动接线OAuth2ProtectedResourceDetails,然后上下文将 始终将访问Tokens转发到下游,同时刷新访问 Tokens到期时自动。(这些是 Spring 的功能 安全和 Spring Boot。spring-doc.cadn.net.cn

Spring Boot (1.4.1) 不会创建OAuth2ProtectedResourceDetails如果您正在使用client_credentialsTokens。在这种情况下,您需要创建自己的ClientCredentialsResourceDetails并配置它@ConfigurationProperties("security.oauth2.client").

Zuul 代理中的客户端Tokens中继

如果您的应用也有 Spring Cloud Zuul 嵌入式反向代理(使用@EnableZuulProxy),那么你 可以要求它将 OAuth2 访问Tokens向下游转发到服务 它是代理的。因此,上面的 SSO 应用程序可以简单地进行增强,例如 这:spring-doc.cadn.net.cn

应用程序.groovy
@Controller
@EnableOAuth2Sso
@EnableZuulProxy
class Application {

}

并且它将(除了登录用户并获取Tokens之外)将身份验证Tokens下游传递给/proxy/*服务业。 如果这些服务是使用@EnableResourceServer然后他们将在correct 标头中获得一个有效的Tokens。spring-doc.cadn.net.cn

它是如何工作的? 这@EnableOAuth2Sso注释拉入spring-cloud-starter-security(您可以在传统应用程序中手动执行),这反过来又会触发一些 一个ZuulFilter,它本身被激活,因为 Zuul 位于类路径(通过@EnableZuulProxy). 过滤器只是从当前经过身份验证的用户中提取一个访问Tokens,并将其放在下游请求的请求标头中。spring-doc.cadn.net.cn

Spring Boot 不会创建OAuth2RestOperations自动,这是需要的refresh_token. 在这种情况下,您需要创建自己的OAuth2RestOperations所以OAuth2TokenRelayFilter如果需要,可以刷新Tokens。

资源服务器Tokens中继

如果您的应用具有@EnableResourceServer您可能希望将incoming token 下游中继到其他服务。如果您使用RestTemplate要联系下游服务,那么这只是一个如何创建具有正确上下文的模板的问题。spring-doc.cadn.net.cn

如果您的服务使用UserInfoTokenServices以验证传入的Tokens(即它使用security.oauth2.user-info-uriconfiguration),然后你可以简单地创建一个OAuth2RestTemplate使用自动接线OAuth2ClientContext(它将由authentication 过程填充,然后再进入后端代码)。等效地(使用 Spring Boot 1.4),您可以注入一个UserInfoRestTemplateFactory并抓住它的OAuth2RestTemplate在 您的配置。 例如:spring-doc.cadn.net.cn

MyConfiguration.java
@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
    return factory.getUserInfoRestTemplate();
}

然后,此剩余模板将具有相同的OAuth2ClientContext(请求范围),因此您可以使用它来发送具有相同访问Tokens的请求。spring-doc.cadn.net.cn

如果您的应用未使用UserInfoTokenServices但仍然是一个客户端(即它声明@EnableOAuth2Client@EnableOAuth2Sso),然后使用 Spring Security Cloud 任何OAuth2RestOperations用户从@Autowired OAuth2Context也会转发 Tokens。 默认情况下,此功能作为 MVC 处理程序拦截器实现,因此它仅适用于 Spring MVC。如果您不使用 MVC您可以使用自定义过滤器或 AOP 拦截器包装AccessTokenContextRelay以提供相同的功能。spring-doc.cadn.net.cn

这是一个基本的示例,显示使用创建的自动连接的 REST 模板其他地方(“foo.com”是一个资源服务器,接受与周围的应用程序相同的Tokens):spring-doc.cadn.net.cn

MyController.java
@Autowired
private OAuth2RestOperations restTemplate;

@RequestMapping("/relay")
public String relay() {
    ResponseEntity<String> response =
      restTemplate.getForEntity("https://foo.com/bar", String.class);
    return "Success! (" + response.getBody() + ")";
}

如果您不想转发Tokens(并且是有效的 选择,因为您可能想扮演自己,而不是 客户端),那么你只需要创建自己的OAuth2Context而不是自动连接默认的。spring-doc.cadn.net.cn

假客户端还将选择一个使用OAuth2ClientContext如果可用,那么他们也应该做一个 Tokens中继RestTemplate愿意。spring-doc.cadn.net.cn