devise
とapartment
gemsを使用してマルチテナント アプリを作成しています。postgresql データベースを使用しています。いくつかのモデルを作成しました。「User」モデルはグローバル名前空間にあり、devise gem による認証に使用されます。テナントの名前空間には、他にもいくつかのモデル (プロジェクト、設定など) があります。
このマルチテナンス アプリを作成するには、このチュートリアルに従いました: https://gorails.com/episodes/multitenancy-with-apartment?autoplay=1
関連するアカウント (user1@gmail.com と user2@gmail.com など) から 2 つの別個のサブドメイン (user1.example.com と user2.example.com など) にログインすると、マルチテナンシー機能は正常に機能しています。 ) 正常に動作し、テナントごとに一意のレコードを作成できます。
ここでの問題は、任意の電子メールを使用して任意のサブドメインにログインでき、アドレス バーに存在するサブドメインに基づいてテナント レコードが表示されることです。たとえば、user1@gmail.com
at でログインすると、認証に成功し、テナントuser2.example.com
のレコードが表示されます。user2
私の質問は、ログイン中に、現在のユーザーのサブドメインが要求されたサブドメインと一致するかどうかを確認する方法 (アドレスバー上) です。一致する場合は認証に進み、管理ダッシュボードを表示し、そうでない場合 (間違ったサブドメインまたは TLD からログイン) を認証します。ユーザーを関連するサブドメインのダッシュボードにリダイレクトします。どうやってやるの?
更新#1:
マイナー デバイス構成を使用して、ユーザー ログインを特定のサブドメインに制限することができました。devise.rb
ファイルでは、認証キーのリストに属性を追加し:subdomain
たため、電子メールとともに正しいサブドメイン値もチェックされますが、サブドメイン値をログインフォームに正しく提供する方法がわかりません. このような非表示フィールドをログイン フォームで<%= f.hidden_field :subdomain, value: request.subdomain %>
使用できますが、ユーザーがブラウザのインスペクターから値を変更できるため、ハッキング可能です。
更新#2:
ユーザーのログインを特定のサブドメインに制限するための簡単な方法を適用することができました。私はこの方法に従いました: https://github.com/plataformatec/devise/wiki/How-to:-Scope-login-to-subdomain
現在、私の唯一の問題は、ユーザーがTLD(example.comなど)からログインできないことです。可能にしたいのですが、ログイン後、ユーザーは関連するサブドメインにリダイレクトされ、セッションが有効になっている必要があります。