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⁴方法的文档说明:
Run Code Online (Sandbox Code Playgroud)# 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
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)
| 归档时间: |
|
| 查看次数: |
8642 次 |
| 最近记录: |