2016-08-30 114 views
3

我試圖建立一個多租戶SaaS應用程序,我知道有多種方法,但我選擇了一個我認爲最適合的多數據庫。多租戶SaaS應用程序的最佳方法

所以我爲每個租戶創建一個數據庫,並在主分區 中存儲租戶表,並根據子域將用戶連接到各自的數據庫。

現在我的問題是在哪裏存儲用戶,在主分貝?或租戶數據庫,存儲在主分貝的用戶將使其難以獲得其他數據庫的用戶相關模型,但將其存儲在租戶數據庫將使其難以對所有用戶進行身份驗證...

也最好的場景是什麼?

  1. 進行身份驗證,獲取jwt令牌。
  2. 向每個請求發送令牌。
  3. 對每個請求驗證令牌,檢查子域,連接到各自的租戶數據庫,執行請求。

這是一個好方法嗎?我應該如何處理用戶表問題? ThnQ

+0

「保存它裏面的租戶數據庫將難以對所有用戶進行身份驗證」爲什麼你想這樣做嗎? –

+0

也許我沒有說清楚......如果我把它存儲在租戶數據庫中,當用戶第一次登錄時沒有指定哪個租戶。我怎麼知道從哪個數據庫進行身份驗證? – Sherif

+1

要麼通過使用看起來像電子郵件的用戶標識(例如,[email protected])明確指定租戶,要麼通過查看提供請求的域名來隱式確定租戶。無論哪種情況,您都希望您的用戶標識在每個承租人中都是唯一的,而不是在所有承租人中唯一。也就是說,如果有人在租戶#1內設置了用戶標識,那麼這不應該阻止其他人在租戶#2內使用用戶標識。 –

回答

0

我可以提供第三個選項。租戶和主數據庫都有用戶。然後,您可以創建過程以在用戶在租戶數據庫中更改時更新主數據庫(反之亦然)。

此外,我不知道Laravel中的模型,但MySQL在跨數據庫JOIN中沒有問題。

+0

我會看看MYSQL交叉db連接,但我儘量避免重複的數據,我認爲這是不好的做法 – Sherif

+0

這取決於。在多租戶應用程序中,有時最好有多個數據以獲得更好的性能。如果一臺服務器不夠用呢?您可以簡單地在多個數據庫服務器之間拆分租戶數據庫,但您仍然需要在主數據庫中使用它們。 –

0

良好的選擇將保持用戶在租戶數據庫。由於您根據子域來區分租戶,因此可以讓您的身份驗證系統查詢子域特定的數據庫。認證的

共享流量

  1. 用戶點擊子域名登錄應用
  2. 用戶憑據將被髮送到應用程序
  3. 將憑據傳遞之前進行認證,決定根據用戶認證數據庫用戶來自的子域。
  4. 通行證數據庫名稱,用戶證書認證系統
  5. 身份驗證系統查詢特定的數據庫和驗證用戶
  6. 生成會話