2017-08-07 49 views
0

我正在使用Zuul作爲將請求路由到我的微服務的反向代理。我還啓用了此反向代理上的資源服務器(@EnableResourceServer),以便對我的授權服務器授權請求。沒有資源服務器的配置,只有一些繞過安全的幾個請求,僅此而已。此反向代理在將請求路由到其他微服務時也簡單地傳遞OAuth2頭,以便其他微服務能夠根據需要執行所有與安全有關的事情。一切都很完美......但是。Spring Cloud - 如何在Zuul反向代理上配置OAuth2RestTemplate以傳遞授權令牌?

我創建的一個zuul過濾器是用於資源擴展的過濾器。這意味着它會根據提供的url參數自動獲取所有相關資源(例如,對於員工資源,url參數可以是「expand = manager,contacts」,它使用員工資源上的HAL鏈接獲取所有這些額外數據,並將額外數據添加到JSON中的嵌入字段)。

我遇到的問題是,當我正在做這個擴展時,我需要使用RestTemplate來進行擴展(以獲取所有應該嵌入的數據)。我無法弄清楚如何配置OAuth2RestTemplate,以便將OAuth2授權頭添加到傳出的請求中。 我試圖從這個春天的雲文檔:

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

但我從OAuth2TokenRelayFilter一些空指針異常。有此過濾器htat看起來像這裏面的條件:

restTemplate.getResource().getClientId() 
       .equals(auth.getOAuth2Request().getClientId()) 

但restTemplate.getResource()返回null,也getClientId()上OAuth2Request實例返回null ...看來我真的失去了一些東西。

引入的OAuth2 RestTemplate的設置之前:

@Bean 
@LoadBalanced 
RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

所以你看到的負載平衡,還需要(使用負載均衡功能區,尤里卡用於那些基於一個服務別名服務發現,所以沒有直接網址在ZUUL配置)

任何建議顯示設置它?

感謝, 盧卡斯

+0

據我所知OAuth2RestTemplate會嘗試從OAuth2用戶服務器,而不是通過現有令牌到你的員工資源的新令牌。嘗試提供只會通過現有令牌的自定義令牌提供程序。 – tsolakp

+0

@tsolakp但我沒有在此代理上配置OAuth2客戶端,因此它不知道clientId和clientSecret。所以實際上這可能是問題。不過,我從春季雲文檔章節(關於令牌中繼)的一篇中瞭解到,它僅適用於資源服務器,並且不需要OAuth2客戶端。 –

回答

0

所以經過一些調查中,我已經配置了反向代理也爲OAuth2Client所以安全上下文是正確設置爲每個請求OAuth2TokenRelayFilter開始工作。

Spring雲文檔「資源服務器令牌中繼」一章介紹了以下內容:「其餘模板將具有相同的OAuth2ClientContext(請求範圍),由認證過濾器使用」。 ...這意味着客戶端必須由@EnableOAuth2Client啓用,以便正確設置OAuth2ClientContext。

我希望我理解正確。

盧卡斯