|
请使用 Spring Cloud Commons 5.0.1 获取最新稳定版本! |
安全
单点登录
| 所有 OAuth2 SSO 和资源服务器功能已在 Spring Boot 1.3 版本中迁移至 Spring Boot。您可以在 Spring Boot 用户指南 中找到相关文档。 |
客户端Tokens中继
如果您的应用程序是一个面向用户的 OAuth2 客户端(即已声明 @EnableOAuth2Sso 或 @EnableOAuth2Client),则它在请求作用域中将拥有一个 OAuth2ClientContext,由 Spring Boot 提供。您可以从此上下文中创建自己的 OAuth2RestTemplate,并结合一个自动注入的 OAuth2ProtectedResourceDetails,之后该上下文将始终将访问Tokens转发至下游服务,并在访问Tokens过期时自动刷新它。(这些功能属于 Spring Security 和 Spring Boot。)
资源服务器Tokens中继
如果您的应用程序具有 @EnableResourceServer,您可能希望将传入的Tokens下游传递给其他服务。如果您使用 RestTemplate 与下游服务进行通信,则只需如何创建带有正确上下文的模板即可。
如果您的服务使用 UserInfoTokenServices 来验证传入的Tokens(即它正在使用 security.oauth2.user-info-uri 配置),那么您可以直接通过自动注入一个 OAuth2RestTemplate(该对象将由认证流程在到达后端代码之前自动填充)。或者,(在 Spring Boot 1.4 及以上版本中),您也可以注入一个 UserInfoRestTemplateFactory,并在配置中获取其 OAuth2RestTemplate。例如:
@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
return factory.getUserInfoRestTemplate();
}
此 REST 模板将具有与身份验证过滤器相同的 OAuth2ClientContext(请求作用域),因此您可以使用它以相同的访问Tokens发送请求。
如果您的应用程序未使用 UserInfoTokenServices,但仍是一个客户端(即它声明了 @EnableOAuth2Client 或 @EnableOAuth2Sso),那么在 Spring Security Cloud 中,用户从 @Autowired OAuth2Context 创建的任何 OAuth2RestOperations 都将自动转发Tokens。此功能默认由一个 MVC 处理器拦截器实现,因此仅适用于 Spring MVC。如果您未使用 MVC,可以通过自定义过滤器或 AOP 拦截器包装一个 AccessTokenContextRelay 来提供相同的功能。
以下是一个基本示例,展示了如何使用在其他地方创建的自动注入的 REST 模板(“foo.com” 是一个资源服务器,接受与周围应用程序相同的Tokens):
@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(这当然是一种合理的选择,因为您可能希望以自身身份行事,而非代表发送Tokens的客户端),那么您只需创建自己的 OAuth2Context,而无需自动装配默认的那一个。
Feign 客户端也会拾取一个拦截器,该拦截器在可用时使用 OAuth2ClientContext,因此它们也应在任何需要进行 RestTemplate Tokens中继的地方执行Tokens中继。