22

ユーザーが標準の Devise コントローラーを介してログアウトすると、Devise は自身のデータだけでなく、セッション ストア全体を破棄するようです。この動作を回避する方法はありますか? 保持する必要のある他の無関係なデータがあります。

session[:my_var] = "123"

デバイス経由でログアウト...

puts session[:my_var]
# => nil
4

4 に答える 4

44

devise の最後のバージョンでは、セッション コントローラーをオーバーライドする必要はありません。代わりに、以下を使用できます。

config.sign_out_all_scopes = false

devise.rbファイル内で目的の動作を取得します。

于 2012-09-26T09:54:03.903 に答える
21

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::Controllers::Helpers#sign_out

Warden::Proxy#logout

于 2012-04-14T20:17:19.973 に答える
16

ショッピングカートを保存するために行ったように、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" }
于 2012-05-11T14:14:09.513 に答える
2

マテウスに加えて。ステートメント

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"
于 2012-05-03T08:18:25.787 に答える