SpringCloud 資源服務(wù)器令牌中繼

2023-12-05 17:26 更新

如果您的應(yīng)用具有@EnableResourceServer,則您可能希望將傳入令牌下游中繼到其他服務(wù)。如果您使用RestTemplate與下游服務(wù)聯(lián)系,那么這只是如何在正確的上下文中創(chuàng)建模板的問題。

如果您的服務(wù)使用UserInfoTokenServices對傳入令牌進(jìn)行身份驗證(即它使用的是security.oauth2.user-info-uri配置),那么您可以使用自動連接的OAuth2ClientContext簡單地創(chuàng)建一個OAuth2RestTemplate(它將由身份驗證填充)在到達(dá)后端代碼之前進(jìn)行處理)。等效地(對于Spring Boot 1.4),您可以注入UserInfoRestTemplateFactory,并在您的配置中獲取其OAuth2RestTemplate。例如:

MyConfiguration.java。 

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

然后,該其余模板將具有與身份驗證過濾器使用的相同的OAuth2ClientContext(請求范圍),因此您可以使用它來發(fā)送具有相同訪問令牌的請求。

如果您的應(yīng)用未使用UserInfoTokenServices,但仍是客戶端(即它聲明了@EnableOAuth2Client@EnableOAuth2Sso),則使用Spring Security覆蓋用戶從{12創(chuàng)建的任何OAuth2RestOperations /} OAuth2Context也將轉(zhuǎn)發(fā)令牌。默認(rèn)情況下,此功能作為MVC處理程序攔截器實現(xiàn),因此僅在Spring MVC中有效。如果您不使用MVC,則可以使用包裝AccessTokenContextRelay的自定義過濾器或AOP攔截器來提供相同的功能。

這是一個基本示例,展示了如何使用在其他位置創(chuàng)建的自動連接的休息模板(“ foo.com”是接受與周圍應(yīng)用程序相同的令牌的資源服務(wù)器):

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

如果您不希望轉(zhuǎn)發(fā)令牌(這是一個有效的選擇,因為您可能想扮演自己的角色,而不是發(fā)送令牌的客戶端),那么您只需要創(chuàng)建自己的OAuth2Context自動裝配默認(rèn)值。

Feign客戶端還將選擇使用OAuth2ClientContext的攔截器(如果可用),因此它們還應(yīng)在RestTemplate可以使用的任何地方進(jìn)行令牌中繼。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號