2016-06-23 13 views
0

私はRails 4.2.6アプリでDevits 3.5.6を1つのStaffUserクラスで問題なく使用しました。アプリはstaff.example.comでアクセスします。Rails/Deviseは未承認と既にサインイン済みの間でバウンスする

今度はclient.example.comでアクセスする別のアプリへのアクセスを提供するために、第2のClientUserクラスを作成しました。

両方のユーザークラスには、独自のスコープ付きビューと拡張セッションコントローラがあります(ClientUserの場合は、使用するレイアウトを上書きするだけです)。

  • 要求/foo、応答は401権限
  • です:

    私がいる問題は、ログインしているClientUserは、多くの場合、ループ/成功裏に保護されたページがロードされる前に、次のような工程を経て、数回にリダイレクトします

  • は、フラッシュメッセージ「あなたはすでにサインインしている」と/foo/client_users/session/new
  • リダイレクトにリダイレクトし

これは、本番環境のほとんどの要求で発生しますが、まれに開発中です。

最初にリクエストされたページで停止する前に、このループが何度も実行されます(ブラウザでChromeの「リダイレクトが多すぎます」という警告が表示されます)。ユーザは再度ログインする機会を得られないため、最初に承認されていなければなりません。

これは影響していないようです。StaffUser

のconfig/routes.rbを

constraints subdomain: 'client' do 
    devise_for :client_users, controllers: { 
    sessions: 'devise/client_sessions' 
    } 

    resources :client_app_object 
end 

constraints subdomain: 'staff' do 
    devise_for :staff_users, controllers: { 
    sessions: 'devise/staff_sessions' 
    } 

    resources :staff_app_object 
end 

設定/イニシャライザ/ devise.rb

config.scoped_views = true 
config.default_scope = :staff_user 

config.warden do |manager| 
    manager.failure_app = CustomFailure 
end 

LIB /考案/ custom_failure.rb

class CustomFailure < Devise::FailureApp 
    def redirect_url 
    if request.subdomain == 'staff' 
     new_staff_user_session_url(subdomain: request.subdomain) 
    elsif request.subdomain == 'client' 
     new_client_user_session_url(subdomain: request.subdomain) 
    else 
     # incorrect/missing subdomain 
     raise CustomFailureException 
    end 
    end 

    ... 
end 

私の作業理論は、DeviseがセッションからClientUserを取得しようとしていますが、それがStaffUserであるかのように扱っているため、初期の401 Unauthorizedが発生しています。

ここに競合状態がありますか?

どのユーザークラスをインスタンス化するのかdeviseはどのように知っていますか?

おかげ

編集1 - 設定/初期化子/ session_store.rb

Rails.application.config.session_store :cookie_store, key: '_my_session' 
+0

クッキーとサブドメインが複雑ですが、ドメイン間でセッションCookieが失われている可能性がありますか?それを確認してください、私はそれが助けて欲しいです。 – Leito

+0

ありがとう@Leito、私がセッション設定に行った唯一の変更は、名前を変更してすべてのユーザーの再認証を強制することでした。私はルートドメインを指定して、両方のサブドメインで同じCookieが使用されていることを確認し、それが何であるかを確認してください。 – Barry

+0

@Leitoそれはdomain_:allをsession_storeに追加してトリックを行いました。私はそれを受け入れることができるように答えとして書くことを望みますか?ありがとう! – Barry

答えて

0

私の問題の原因は、私はデフォルトの工夫コントローラ(と私のアプリケーションコントローラを延長していたことだった私を発見しました)をモデルのクラス名と競合する名前空間に変換します。具体的にはClient::*****ControllerClientです。

クラスの名前空間を未使用の名前に変更すると、競合が解決されました。

同じ問題には、この問題を混乱させる他の副作用もありました。これには拡張クラスのフィルタが含まれていますが、これはおそらく正常に拡張されなかったためです。なぜこれが静かに断続的にしか発生しなかったのかまだ分かりません。

関連する問題