簡體   English   中英

Spring Cloud - 如何僅允許訪問特定微服務的端點?

[英]Spring Cloud - how to allow access to endpoint for specific microservice only?

我有簡單的微服務架構:

  • 優質服務
  • 服務注冊
  • auth服務(我正在使用JWT和OAuth2)
  • 用戶服務
  • 前端和一些核心服務

當用戶嘗試登錄時,憑據將從邊緣服務傳遞到身份驗證服務。 Auth服務從用戶服務(使用@FeignClient )獲取用戶數據,如果用戶名/密碼匹配,則生成令牌。 沒什么好看的。

這種方法存在“小問題”:用戶服務中的端點/api/user/{username} ,由auth服務用於獲取用戶的數據,任何用戶都可以使用它來獲取任何其他用戶的數據(密碼,角色等)。 一個解決方案是以某種方式為角色AUTH_SERVICE auth-service創建JWT令牌,並在用戶服務端檢查JWT,如果角色不同, AUTH_SERVICE拒絕AUTH_SERVICE請求。

還有其他解決方案嗎?

編輯

我認為我的設計很常見,但顯然我應該首先更具體:

  • Auth-servie是我的授權服務器,其他服務是資源服務器
  • 我使用API​​網關模式,我的auth服務也是behin代理
  • 在客戶端應用程序獲得JWT之后,它將其添加到每個請求並基於執行認證和授權; 每個資源服務器都有一個公鑰,用於驗證簽名; 如果它有效,則服務知道JWT已由受信任的身份驗證服務生成,並且基於JWT的服務創建包含所有用戶信息的OAuth2Authenication對象

EDIT2:

我最終將auth-service與用戶服務合並,這是來自幾個SO用戶的建議。 在考慮之后,似乎沒有必要為JWT生成單獨的auth服務。 我接受了@Abhijit Sarkar的答案,因為它有一些有效點,即使他對額外調用auth-service以驗證令牌的有效性是不對的。

在我看來,你的服務太薄了; 這種情況發生了,隨着時間的推移,您開始意識到由於維護和性能問題,服務需要更粗糙。 從auth到用戶服務的另一個HTTP調用的成本,以及維護服務間身份驗證的開銷並不是微不足道的。

IMO,用戶服務可以存在其他用戶信息,如地址等,如果存在,但auth服務應負責管理自己的數據。 這正是Spring Security擁有UserDetailsS​​ervice的原因

無論用戶憑據和其他用戶信息是在同一個表中,還是在同一個數據庫中,這都是一種設計選擇。 不同的人會給你不同的答案,但根據我的意見和經驗,可以接受少量 相關服務之間的共享數據庫,特別是因為這些表將通過外鍵(userId)相關聯。 分布式事務是純粹的邪惡與微服務,所以我甚至沒有去那里。 刪除/更新用戶時,請使用事件進行最終一致性。

編輯

在與OP聊天之后,我了解到用戶服務實際上是他設計中的OAuth資源服務器。 他不清楚,因此對我來說,OAuth授權服務器在哪里。 無論如何,我堅持我的建議是合並用戶服務和auth服務。

在auth和用戶服務中使用相同的數據庫會更好。 Auth服務只需要訪問憑證。

您甚至可以在用戶服務上擁有一個安全層,以根據角色實現對URI的訪問控制。

你需要這樣的東西:

  1. 在邊緣服務中定義預濾波器
  2. 邊緣服務獲取身份驗證請求並將其轉發到身份驗證服務。
  3. Auth服務使用與用戶服務相同的DB來驗證用戶身份並生成JWT令牌。
  4. 所有其他請求將在請求標頭中具有令牌。
  5. 邊緣服務共享創建JWT令牌的密鑰或具有用於驗證簽名的公鑰。
  6. 邊緣服務在其預過濾器中驗證令牌,並在平面中的請求標頭中添加用戶信息。 將請求重定向到所需服務。
  7. 服務接收請求,並在其安全過濾器中,它使用標頭中的用戶信息來強制對資源進行訪問控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM