更多详情

单点登录

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

Token Relay

令牌中继是 OAuth2 使用者充当客户端的地方,而 将传入令牌转发到传出资源请求。这 consumer 可以是纯 Client(如 SSO 应用程序)或 Resource 服务器。spring-doc.cn

Spring Cloud 网关中的客户端令牌中继

如果您的应用程序还具有 Spring Cloud Gateway 嵌入式反向代理,然后您 可以要求它将 OAuth2 访问令牌转发到下游服务 它是代理。因此,上面的 SSO 应用程序可以简单地增强,就像 这:spring-doc.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();
}

或者这个spring-doc.cn

应用程序.yaml
spring:
  cloud:
    gateway:
      routes:
      - id: resource
        uri: http://localhost:9000
        predicates:
        - Path=/resource
        filters:
        - TokenRelay=

它会(除了登录用户和获取令牌之外) 将身份验证令牌下游传递给服务(在本例中)。/resourcespring-doc.cn

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

  • org.springframework.boot:spring-boot-starter-oauth2-clientspring-doc.cn

  • org.springframework.cloud:spring-cloud-starter-securityspring-doc.cn

它是如何工作的?过滤器从当前经过身份验证的用户中提取访问令牌 并将其放入下游请求的请求标头中。spring-doc.cn

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

的默认实现 used by 使用内存中数据存储。如果您需要更强大的解决方案,则需要提供自己的实现。ReactiveOAuth2AuthorizedClientServiceTokenRelayGatewayFilterFactoryReactiveOAuth2AuthorizedClientService

客户端令牌中继

如果您的应用程序是面向用户的 OAuth2 客户端(即已声明 or ),则它具有来自 Spring Boot 的 in 请求范围。您可以 从此上下文中创建自己的 Cookie,并在 autowired 的 ,然后上下文将 始终将访问令牌转发到下游,同时刷新访问权限 令牌。(这些是 Spring 的功能 Security 和 Spring Boot 的 Boot。@EnableOAuth2Sso@EnableOAuth2ClientOAuth2ClientContextOAuth2RestTemplateOAuth2ProtectedResourceDetailsspring-doc.cn

Spring Boot (1.4.1) 如果您使用令牌,则不会自动创建。在这种情况下,您需要创建自己的 API 并使用 进行配置。OAuth2ProtectedResourceDetailsclient_credentialsClientCredentialsResourceDetails@ConfigurationProperties("security.oauth2.client")

Zuul 代理中的客户端令牌中继

如果您的应用程序还具有 Spring Cloud Zuul 嵌入式反向代理 (使用 ) 然后你 可以要求它将 OAuth2 访问令牌转发到下游服务 它是代理。因此,上面的 SSO 应用程序可以简单地增强,就像 这:@EnableZuulProxyspring-doc.cn

app.groovy
@Controller
@EnableOAuth2Sso
@EnableZuulProxy
class Application {

}

它会(除了登录用户和获取令牌之外) 将身份验证令牌下游传递给服务。如果这些服务是使用 实现的,则它们将在 正确的标题。/proxy/*@EnableResourceServerspring-doc.cn

它是如何工作的?注解会拉入(您可以在 traditional 应用程序),这反过来又会触发一些 a ,它本身被激活,因为 Zuul 位于 类路径 (VIA )。过滤器只是从当前经过身份验证的用户中提取访问令牌 并将其放入下游请求的请求标头中。@EnableOAuth2Ssospring-cloud-starter-securityZuulFilter@EnableZuulProxyspring-doc.cn

Spring Boot 不会自动创建一个 .在这种情况下,您需要创建自己的令牌,以便在需要时刷新令牌。OAuth2RestOperationsrefresh_tokenOAuth2RestOperationsOAuth2TokenRelayFilter

资源服务器令牌中继

如果您的应用程序具有,您可能希望中继 传入令牌下游到其他服务。如果您使用 a 联系下游服务,则这只是一个 如何创建具有正确上下文的模板的问题。@EnableResourceServerRestTemplatespring-doc.cn

如果您的服务用于对传入的 令牌(即它正在使用配置),那么你可以简单地使用自动连接的 authentication 进程)。等效 (使用 Spring Boot 1.4),您可以注入 a 并获取其 您的配置。例如:UserInfoTokenServicessecurity.oauth2.user-info-uriOAuth2RestTemplateOAuth2ClientContextUserInfoRestTemplateFactoryOAuth2RestTemplatespring-doc.cn

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

然后,此 rest 模板将具有与身份验证筛选器使用的相同(请求范围),因此您可以 使用它来发送具有相同访问令牌的请求。OAuth2ClientContextspring-doc.cn

如果您的应用程序未使用,但仍是客户端 (即它声明 或 ),然后 使用 Spring Security Cloud 用户 从 Will 创建 也向前 令 牌。默认情况下,此功能作为 MVC 处理程序实现 interceptor 中,因此它只能在 Spring MVC 中工作。如果您未使用 MVC 您可以使用自定义过滤器或 AOP 拦截器包装 来提供相同的功能。UserInfoTokenServices@EnableOAuth2Client@EnableOAuth2SsoOAuth2RestOperations@AutowiredOAuth2ContextAccessTokenContextRelayspring-doc.cn

下面是一个基本的 显示使用已创建的自动装配 REST 模板的示例 elsewhere (“foo.com” 是接受与 周围的应用程序):spring-doc.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() + ")";
}

如果您不想转发令牌(这是有效的 选择,因为您可能希望扮演您自己,而不是 客户端)的令牌,则您只需创建自己的令牌,而不是自动装配默认令牌。OAuth2Contextspring-doc.cn

假客户端也会选择一个使用 if it is available 的拦截器,所以他们也应该执行一个 token relay 中继到任何会的地方。OAuth2ClientContextRestTemplatespring-doc.cn