似乎当用户通过标准的 Devise 控制器注销时,Devise 会破坏整个会话存储,而不仅仅是它自己的数据。有什么办法可以避免这种行为?我还有其他不相关的数据应该保留。
session[:my_var] = "123"
通过设备注销...
puts session[:my_var]
# => nil
似乎当用户通过标准的 Devise 控制器注销时,Devise 会破坏整个会话存储,而不仅仅是它自己的数据。有什么办法可以避免这种行为?我还有其他不相关的数据应该保留。
session[:my_var] = "123"
通过设备注销...
puts session[:my_var]
# => nil
在设计的最新版本中,不需要覆盖会话控制器,而是您可以使用:
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))
考虑到以多个角色登录的可能性,这可能是最好的一般注销语句。对于您而言,如果您的用户仅作为一个角色登录,并且您希望在退出时保留会话的其余部分,最简单的方法是:
$ 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"