ユーザーが標準の Devise コントローラーを介してログアウトすると、Devise は自身のデータだけでなく、セッション ストア全体を破棄するようです。この動作を回避する方法はありますか? 保持する必要のある他の無関係なデータがあります。
session[:my_var] = "123"
デバイス経由でログアウト...
puts session[:my_var]
# => nil
ユーザーが標準の Devise コントローラーを介してログアウトすると、Devise は自身のデータだけでなく、セッション ストア全体を破棄するようです。この動作を回避する方法はありますか? 保持する必要のある他の無関係なデータがあります。
session[:my_var] = "123"
デバイス経由でログアウト...
puts session[:my_var]
# => nil
devise の最後のバージョンでは、セッション コントローラーをオーバーライドする必要はありません。代わりに、以下を使用できます。
config.sign_out_all_scopes = false
devise.rb
ファイル内で目的の動作を取得します。
のdestroy
¹メソッドにSessionsController
は、次の行が含まれています。
signed_out = Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
sign_out_all_scopes
²メソッドは引数なしで呼び出し、warden.logout
³sign_out
メソッドは。を呼び出しますwarden.logout(scope)
。
logout
⁴メソッドのドキュメントには次のように記載されています。
# Logout everyone and clear the session env['warden'].logout # Logout the default user but leave the rest of the session alone env['warden'].logout(:default)
結論:sign_out
特定のスコープが与えられた場合、セッションを保持する必要があります。しかし、それを行う方法がわかりません。常にsign_out_all_scopes
最初に呼び出され、ユーザーをログアウトできなかった場合にのみ戻ります。false
課題追跡システムに機能リクエストを投稿するか、独自の認証ソリューションを開発することをお勧めします。Railsは現在、を提供してhas_secure_password
おり、最近では、これらの問題に遭遇することを避けるために、後者を採用しているようです。
¹Devise::SessionsController#destroy
²Devise::Controllers::Helpers#sign_out_all_scopes
ショッピングカートを保存するために行ったように、DeviseのSessionControllerをオーバーライドすることができます。
session_controller.rb
class SessionsController < Devise::SessionsController
def destroy
order_id = session[:order_id]
super
session[:order_id] = order_id
end
end
ルート.rb
devise_for :users, :controllers => { :sessions => "sessions" }
マテウスに加えて。ステートメント
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
複数のロールでサインインする可能性を考えると、おそらく最も一般的なログアウト ステートメントです。あなたの場合、ユーザーが 1 つのロールとしてサインインしただけで、サインアウト時に残りのセッションを保持したい場合、最も簡単な方法は次のとおりです。
$ git clone git://github.com/plataformatec/devise.git
$ cd devise
$ git branch my_devise
$ git checkout my_devise
エディターで app/controllers/devise/sessions_controller.rb を開きます。メソッドdestroyで、置き換えます
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
と
signed_out = sign_out(resource_name)
エディターを保存して終了し、実行します
$ git commit -am "remove only warden data from session on logout, preserve other data."
プロジェクトの Gemfile に、次のように工夫する依存関係を記述します。
gem 'devise', :path => "[YOUR PATH]/devise", :branch => "my_devise"