22

似乎当用户通过标准的 Devise 控制器注销时,Devise 会破坏整个会话存储,而不仅仅是它自己的数据。有什么办法可以避免这种行为?我还有其他不相关的数据应该保留。

session[:my_var] = "123"

通过设备注销...

puts session[:my_var]
# => nil
4

4 回答 4

44

在设计的最新版本中,不需要覆盖会话控制器,而是您可以使用:

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))

考虑到以多个角色登录的可能性,这可能是最好的一般注销语句。对于您而言,如果您的用户仅作为一个角色登录,并且您希望在退出时保留会话的其余部分,最简单的方法是:

$ git clone git://github.com/plataformatec/devise.git
$ cd devise
$ git branch my_devise
$ git checkout my_devise

在编辑器中打开 app/controllers/devise/sessions_controller.rb。在销毁方法中,替换

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 回答