4

シナリオ: サブドメインとデバイスを使用するマルチテナント Rails アプリ 問題: ユーザーが mydomain.com にログインし、ログイン ユーザーとして自分の subdomain1.mydomain.com アドレスに転送できるようにしたい。現在、彼らは自分のサブドメインに直接ログインすることしかできません.

私は比較的 Rails の初心者であり、単純な解決策を見つけることができません (ただし、解決策が必要なようです)。理想的には、mydomain.com と subdomain1.mydomain.com で 1 つの Cookie を共有したいのですが、カスタム ミドルウェアを作成するスキルがありません。明らかに、マルチテナントであるため、すべてのサブドメインで 1 つのセッションを共有することはできません。これに数日間立ち往生し、OAuthまたは他のより面倒なソリューションを検討し始める前に、私が見逃している簡単なソリューション(config.session_storeドメイン設定など)があるかどうかに興味があります。どんな助けでも大歓迎です!

編集:もちろん、投稿後にこれを見つけただけです。Rails と Devise に登録した後、ユーザーをサブドメインにログインさせます。config.session_store ドメインを試してみます: :all フィルターの前に推奨事項を指定し、機能しない場合は詳細を投稿します。少なくとも良い考えのようです。

編集:サブドメイン設定を使用して特定のデバイスで機能したソリューション:

class ApplicationController < ActionController::Base

  before_action :check_subdomain

  def check_subdomain 
    unless request.subdomain == "" or request.subdomain == session[:subdomain]
      redirect_to request.protocol+request.domain
    end
  end

end

session_store.rb
My::Application.config.session_store :cookie_store, key: '_my_session' , :domain => :all, :tld_length => 2

基本的に、ログイン時に session[:subdomain] を使用してセッションにサブドメインを設定し、それを使用してセッションを現在のユーザーにスコープします。それ以外の場合、session_store でドメインが :all に設定されていると、スコープが壊れます。ユーザーが承認されていない場合、request.protocol (http:// または https://) +request.domain リダイレクトを介して公開ホームページにリダイレクトされます。単純!これで、ユーザーは同じセッション内でベース ドメインとサブドメインの間を移動できます。

4

1 に答える 1

2

クッキー

あなたが投稿した内容から、セッション Cookie の追跡に問題があると推測されます。サブドメインを利用したアプリケーションでも同様の問題があり、2 つの間で切り替えるたびに Cookie が削除されました。

Rails のサブドメイン間でセッション (Cookie) を共有しますか?

#config/initializers/session_store.rb
Your_App::Application.config.session_store :cookie_store, key: '_your_app_session', domain: :all, tld_length: 2

秘訣はtld_length引数です。これにより、ドメインの「レベル」に対応できる数を定義できます。IE サブドメインを使用している場合は、tld_lengthそれを反映するように設定する必要があります


転送

転送に問題があるかどうかはわかりません。とにかくアイデアを出します。

「サブドメイン」にログインするときは、Rails の真のマルチテナンシー実装 (各ユーザーが異なるデータベースに格納されている) を使用していない限り、ユーザーがメイン フォームにログインできるようにする必要があります。次に、問題なくサブドメインにリダイレクトします

考慮する必要があるのは、パス ヘルパーを使用する場合にのみsubdomain制約が設定されることです。_url

<%= link_to "Your Name", path_url(subdomain: "subdomain_1") %>

これは、_pathヘルパーがベース URL に対して相対的であるため、subdomainオプションを入力できないためです。または、_urlパス ヘルパーは URL 全体を指します。これにより、必要に応じてサブ ドメインを定義できます。

--

リクエストを送信し、引き続きユーザーがサインインしたままにする場合は、サブドメイン全体で認証を維持できることを確認する必要があります。IE の「メイン」ページにシングル サインイン フォームがある場合は、サブドメインへの認証を続行できることを確認する必要があります。

于 2014-08-01T08:04:05.517 に答える