devise
とapartment
の宝石を使用してマルチテナントアプリを作成しています。私はpostgresqlデータベースを使用しています。私はいくつかのモデルを作った。 'User'モデルはグローバル名前空間にあり、devise gemによる認証に使用されます。テナント名前空間にある他のモデル(Project、Settingなど)があります。Rails:デビーズとアパートメントの宝飾品を使用したマルチテナント
私はこのマルチtenanceアプリを作成するために、このチュートリアルに従ってきました:https://gorails.com/episodes/multitenancy-with-apartment?autoplay=1
マルチテナント機能は、私は2つの別々のサブドメインにログインしている場合(例えばuser1.example.com意味で正常に動作していると[email protected]や[email protected])から、それはうまく動作し、私は各テナントごとに一意のレコードを作成することができます。
問題は、任意のメールを使用してサブドメインにログインでき、アドレスバーにあるサブドメインに基づいてテナントレコードが表示されることです。例えば私は[email protected]
とuser2.example.com
でログインすることができ、それは成功裏にautheticateし、user2
テナントの記録を表示します。
私の質問は、現在のユーザーのサブドメインが要求されたサブドメイン(アドレスバー上)と一致するかどうかを確認する方法、認証が進行して管理ダッシュボードを表示する場合(誤ったサブドメインまたはTLDから)ユーザを認証しますが、関連するサブドメインのダッシュボードにリダイレクトします。どうやってやるの?
UPDATE#1:
私はマイナーな工夫の設定を使用して、特定のサブドメインへのユーザーのログインを制限することができました。 devise.rb
ファイルでは、認証キーのリストに:subdomain
属性が追加されているため、サブドメインの値が正しいかどうかを電子メールでチェックしますが、ログインフォームにサブドメインの値を正しく入力する方法がわかりません。ログインフォーム<%= f.hidden_field :subdomain, value: request.subdomain %>
でこのような隠しフィールドを使用できますが、ユーザーがブラウザのインスペクタからその値を変更できるので、ハック可能です。
UPDATE#2:
私は彼らの特定のサブドメインへのユーザーのログインを制限する愚か者証明方法を適用することができました。私はこの方法に従いました:https://github.com/plataformatec/devise/wiki/How-to:-Scope-login-to-subdomain 私の唯一の問題は、ユーザーがTLD(例:example.com)からログインできないことです。私はそれを可能にしたいのですが、ログイン後にユーザーを関連するサブ - 生きているセッションでのドメイン。あなたは、ユーザーテーブルに、あなたがチェックすると、あなたのサブドメインを保存する場合
if user.subdomain == request.subdomain
redirect_to root_url(subdomain: user.subdomain)
else
everything_is_ok
end
私はこの条件を ':authenticate_user'フィルタの前に掛けなければならないと仮定しますが、それは初心者です。少し説明していただけますか?また、元の質問に更新を加えました。 –