2016-08-04 10 views
1

deviseapartmentの宝石を使用してマルチテナントアプリを作成しています。私は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 

答えて

0

あなたはUserモデルにサブドメインを節約していると仮定すると、あなたのコントローラーで検証を作成することができますのようなものを使用することができますそれはrequest.subdomain経由で誰かがどのように他のテナント(会社)に参加することができますか?それらは複数の会社に含めることができます。

それで、私はそれを処理するために2つの中間テーブルを作成しました。

  • 私は私のすべてのユーザーのためにユーザーテーブルをしました。
  • 私はアカウント作成者とサブドメインを格納するテーブルです。
  • そして、私はaccount_permissions誰がどこに許可されているかを知りました。

のでuser1user2.example.comに来るとき、私は私のAccount_permissionsに問い合わせることだし、それがuser2.example.comの許可を持っている場合、私はそれを手放します。

このように意味があるようです。

+0

私はこの条件を ':authenticate_user'フィルタの前に掛けなければならないと仮定しますが、それは初心者です。少し説明していただけますか?また、元の質問に更新を加えました。 –

0

+0

現在、私はレールが新しく、シンプルにしたいので、1人のテナントが1人のユーザーしか持たないと仮定しました。しかし、あなたが示唆している構造は、はるかに柔軟であるようです。 –

関連する問題