停止设置清算会议

blo*_*ilk 22 ruby ruby-on-rails devise ruby-on-rails-3

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

session[:my_var] = "123"
Run Code Online (Sandbox Code Playgroud)

通过设计退出...

puts session[:my_var]
# => nil
Run Code Online (Sandbox Code Playgroud)

小智 43

在设备的持续版本中,覆盖会话控制器不是必需的,而是可以使用:

config.sign_out_all_scopes = false
Run Code Online (Sandbox Code Playgroud)

在devise.rb文件中获取所需的行为.


Mat*_*ira 20

所述destroy的方法¹ SessionsController包含以下行:

signed_out = Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
Run Code Online (Sandbox Code Playgroud)

该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)
Run Code Online (Sandbox Code Playgroud)

结论: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

  • 感谢您的所有努力,马修斯. (2认同)

man*_*ire 15

您可以像我保留购物车一样覆盖Devise的SessionController:

sessions_controller.rb

class SessionsController < Devise::SessionsController

    def destroy
        order_id = session[:order_id] 
        super  
        session[:order_id] = order_id
    end

end
Run Code Online (Sandbox Code Playgroud)

的routes.rb

devise_for :users, :controllers => { :sessions => "sessions" }
Run Code Online (Sandbox Code Playgroud)

  • 简单的解决方案!谢谢你的贡献. (3认同)