2015-04-03 78 views
3

我試圖實現Feign客戶端從用戶的服務,我目前正在請求與oAuth2RestTemplate,它的工作原理我的用戶信息。但是現在我想更改爲Feign,但是我得到錯誤代碼401可能是因爲它沒有攜帶用戶令牌,所以如果Spring對Feign的支持使用了RestTemplate,我可以使用它來自定義方式我自己的豆?春天雲Feign OAuth2RestTemplate

今天我實現這樣

該服務的客戶端

@Retryable({RestClientException.class, TimeoutException.class, InterruptedException.class}) 
@HystrixCommand(fallbackMethod = "getFallback") 
public Promise<ResponseEntity<UserProtos.User>> get() { 
    logger.debug("Requiring discovery of user"); 
    Promise<ResponseEntity<UserProtos.User>> promise = Broadcaster.<ResponseEntity<UserProtos.User>>create(reactorEnv, DISPATCHER) 
      .observe(Promises::success) 
      .observeError(Exception.class, (o, e) -> Promises.error(reactorEnv, ERROR_DISPATCHER, e)) 
      .filter(entity -> entity.getStatusCode().is2xxSuccessful()) 
      .next(); 
    promise.onNext(this.client.getUserInfo()); 
    return promise; 

} 

而客戶端

@FeignClient("account") 
public interface UserInfoClient { 

    @RequestMapping(value = "/uaa/user",consumes = MediaTypes.PROTOBUF,method = RequestMethod.GET) 
    ResponseEntity<UserProtos.User> getUserInfo(); 
} 

回答

7

假死不使用RestTemplate所以你必須找到不同的方式。如果您創建@Bean類型的feign.RequestInterceptor它將應用於所有請求,所以也許其中一個OAuth2RestTemplate(僅用於管理令牌獲取)將是最佳選擇。

+0

感謝@戴夫,創造RequestInterceptor'的'一個bean,並從設置承載令牌o Request在RequestTemplate頭上工作 – 2015-04-04 15:52:21

+0

太棒了。也許你可以將它貢獻回春季雲安全? – 2015-04-05 16:58:09

+0

當然,我會在GitHub上提出一張票,所以我們可以在那裏討論它 – 2015-04-05 20:52:07

3

這是我的解決方案,只是爲了補充與源代碼中的另一個答案,實現接口feign.RequestInterceptor

@Bean 
public RequestInterceptor requestTokenBearerInterceptor() { 
    return new RequestInterceptor() { 
     @Override 
     public void apply(RequestTemplate requestTemplate) { 
      OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) 
        SecurityContextHolder.getContext().getAuthentication().getDetails(); 

      requestTemplate.header("Authorization", "bearer " + details.getTokenValue()); 
     } 
    }; 
} 
+0

我使用了一個具體的實現,所以我可以避免空指針併發送令牌給未受保護的資源,以防請求中不包含令牌或經過驗證的用戶,因爲現在我們無法自定義每個客戶端攔截器。如果你有興趣,你可以在這裏查看:https://github.com/crly/commons/blob/master/src/main/java/io/curly/commons/config/feign/OAuth2FeignRequestInterceptor.java – 2015-07-09 17:20:47

+0

很好的解決方案!在我的風景中(一個資源服務器請求另一個資源服務器)總是需要經過認證的用戶/令牌。感謝分享! – 2015-07-09 18:18:07

+0

只需添加我的兩分錢:配置sessionCreationPolicy至少爲「IF_REQUIRED」是很重要的,因爲SecurityContext將是空的,否則=)感謝這個解決方案,最終得到令牌中繼 – 2016-07-08 10:37:46