安全
单点登录
所有的 OAuth2 SSO 和资源服务器功能在 1.3 版本中移到了 Spring Boot。你可以在 Spring Boot 用户指南 中找到相关文档。
客户端令牌中继
如果你的应用是一个面向用户的 OAuth2 客户端(即声明了 @EnableOAuth2Sso 或 @EnableOAuth2Client),那么它会在请求作用域中拥有一个来自 Spring Boot 的 OAuth2ClientContext。你可以从这个上下文和自动装配的 OAuth2ProtectedResourceDetails 创建你自己的 OAuth2RestTemplate,然后上下文将始终将访问令牌转发到下游,并在访问令牌过期时自动刷新它。(这些是 Spring Security 和 Spring Boot 的特性。)
资源服务器令牌中继
如果你的应用程序启用了 @EnableResourceServer,你可能希望将传入的令牌中继到下游的其他服务。如果你使用 RestTemplate 来联系下游服务,那么这只是一个如何创建具有正确上下文的模板的问题。
如果你的服务使用 UserInfoTokenServices 来验证传入的令牌(即它使用了 security.oauth2.user-info-uri 配置),那么你可以简单地使用自动装配的 OAuth2ClientContext 创建一个 OAuth2RestTemplate(它会在到达后端代码之前由认证过程填充)。同样地(使用 Spring Boot 1.4),你可以注入一个 UserInfoRestTemplateFactory 并在你的配置中获取它的 OAuth2RestTemplate。例如:
@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
return factory.getUserInfoRestTemplate();
}
这个 rest 模板将拥有与身份验证过滤器相同的 OAuth2ClientContext(请求作用域),因此你可以使用它来发送带有相同访问令牌的请求。
如果你的应用程序没有使用 UserInfoTokenServices,但仍然是一个客户端(即它声明了 @EnableOAuth2Client 或 @EnableOAuth2Sso),那么在 Spring Security Cloud 中,用户从 @Autowired 的 OAuth2Context 创建的任何 OAuth2RestOperations 也会转发令牌。此功能默认实现为 MVC 处理程序拦截器,因此它仅在 Spring MVC 中有效。如果你没有使用 MVC,你可以使用自定义过滤器或 AOP 拦截器包装 AccessTokenContextRelay 来提供相同的功能。
这是一个基本示例,展示了如何使用在其他地方创建的自动装配的 RestTemplate("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() + ")";
}
如果你不想转发令牌(这是一个有效的选择,因为你可能希望以你自己的身份行事,而不是以发送令牌的客户端的身份),那么你只需要创建自己的 OAuth2Context,而不是自动注入默认的 OAuth2Context。
Feign 客户端也会使用可用的 OAuth2ClientContext 拦截器,因此它们在任何 RestTemplate 会进行令牌中继的地方也应该进行令牌中继。