簡體   English   中英

Rails:使用 Devise 和 Apartment gem 的多租戶

[英]Rails: Multi-tenancy with Devise and Apartment gem

我正在使用deviseapartment gems 創建一個多租戶應用程序。 我正在使用 postgresql 數據庫。 我創建了幾個模型。 'User' model 在全局命名空間中,用於 devise gem 的身份驗證。 在租戶命名空間中還有一些其他模型(例如項目、設置等)。

我已經按照本教程創建了這個多租戶應用程序: https://gorails.com/episodes/multitenancy-with-apartment?autoplay=1

多租戶功能在某種意義上工作正常,如果我從他們的相關帳戶(例如 user1@gmail.com 和 user2@gmail.com)登錄到兩個單獨的子域(例如 user1.example.com 和 user2.example.com) ) 它工作正常,我可以為每個租戶創建唯一的記錄。

現在,問題是,我可以使用任何 email 登錄到任何子域,租戶記錄將根據地址欄中存在的子域顯示。 例如,我可以在user2.example.com使用user1@gmail.com登錄,它將成功驗證並顯示user2租戶的記錄。

我的問題是,登錄時如何檢查當前用戶的子域是否與請求的子域匹配(在地址欄上),如果匹配則繼續進行身份驗證並顯示管理儀表板,如果不匹配(從錯誤的子域或 TLD 登錄)進行身份驗證用戶,但將他重定向到他相關子域的儀表板。 我怎樣才能做到這一點?

更新#1:

我能夠通過使用次要的 devise 配置來限制用戶登錄到他們的特定子域。 devise.rb文件中,我在身份驗證密鑰列表中添加了:subdomain屬性,因此它還將檢查正確的子域值以及 email,但是我不確定如何正確地向登錄表單提供子域值。 我可以在登錄表單中使用這樣的隱藏字段<%= f.hidden_field:subdomain, value: request.subdomain %>但它是可破解的,因為用戶可以從瀏覽器檢查器更改它的值。

更新#2:

我能夠應用一種萬無一失的方法來限制用戶登錄到他們的特定子域。 我遵循了這種方法: https://github.com/plataformatec/devise/wiki/How-to:-Scope-login-to-subdomain

現在,我唯一的問題是用戶無法從 TLD(例如 example.com)登錄,我希望它成為可能,但在登錄后用戶必須被重定向到他們相關的子域,並且有效 session。

假設您要在User模型上保存子域,您可以在控制器中創建一個驗證,您可以使用以下內容:

if user.subdomain == request.subdomain
  redirect_to root_url(subdomain: user.subdomain)
else
  everything_is_ok
end

如果您將子域存儲在User表中,並且通過request.subdomain檢查它,那么有人如何加入另一個租戶(公司)? 它們可以包含在多個公司中。

這就是為什么我創建了2個中間表來處理它。

  • 我為所有用戶提供了用戶表。
  • 我有一個帳戶表來存儲子域名及其創建者。
  • 我已經通過account_permissions來了解誰被授權到哪里。

因此,當user1訪問user2.example.com ,我正在查詢我的Account_permissions ,如果它有user2.example.com權限,我就放手。

這種方式似乎很有道理。

如果有人仍然有類似的問題並且不是 ROR 的專家,我建議先構建基本應用程序,然后使用該視頻將其制作成多租戶。 構建你的應用程序后,你只需要安裝公寓 gem,然后制作一個 model 存儲租戶信息,然后將其排除在多租戶之外。

暫無
暫無

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

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