SpringCloud 资源服务器令牌中继

2023-12-05 17:26 更新

如果您的应用具有@EnableResourceServer,则您可能希望将传入令牌下游中继到其他服务。如果您使用RestTemplate与下游服务联系,那么这只是如何在正确的上下文中创建模板的问题。

如果您的服务使用UserInfoTokenServices对传入令牌进行身份验证(即它使用的是security.oauth2.user-info-uri配置),那么您可以使用自动连接的OAuth2ClientContext简单地创建一个OAuth2RestTemplate(它将由身份验证填充)在到达后端代码之前进行处理)。等效地(对于Spring Boot 1.4),您可以注入UserInfoRestTemplateFactory,并在您的配置中获取其OAuth2RestTemplate例如:

MyConfiguration.java。 

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

然后,该其余模板将具有与身份验证过滤器使用的相同的OAuth2ClientContext(请求范围),因此您可以使用它来发送具有相同访问令牌的请求。

如果您的应用未使用UserInfoTokenServices,但仍是客户端(即它声明了@EnableOAuth2Client@EnableOAuth2Sso),则使用Spring Security覆盖用户从{12创建的任何OAuth2RestOperations /} OAuth2Context也将转发令牌。默认情况下,此功能作为MVC处理程序拦截器实现,因此仅在Spring MVC中有效。如果您不使用MVC,则可以使用包装AccessTokenContextRelay的自定义过滤器或AOP拦截器来提供相同的功能。

这是一个基本示例,展示了如何使用在其他位置创建的自动连接的休息模板(“ foo.com”是接受与周围应用程序相同的令牌的资源服务器):

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() + ")";
}

如果您不希望转发令牌(这是一个有效的选择,因为您可能想扮演自己的角色,而不是发送令牌的客户端),那么您只需要创建自己的OAuth2Context自动装配默认值。

Feign客户端还将选择使用OAuth2ClientContext的拦截器(如果可用),因此它们还应在RestTemplate可以使用的任何地方进行令牌中继。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号