看来当用户通过标准的制定控制器注销,设计破坏了整个会话存储,不仅仅是其拥有的数据。 有什么办法来避免这种行为? 我应该保持周围其他的无关数据。
session[:my_var] = "123"
注销通过色器件...
puts session[:my_var]
# => nil
看来当用户通过标准的制定控制器注销,设计破坏了整个会话存储,不仅仅是其拥有的数据。 有什么办法来避免这种行为? 我应该保持周围其他的无关数据。
session[:my_var] = "123"
注销通过色器件...
puts session[:my_var]
# => nil
该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
,如果它不能记录任何用户了。
我建议无论是发布功能请求他们的问题跟踪或开发自己的身份验证解决方案。 轨现在提供has_secure_password
,这几天人们似乎为了避免陷入这些问题需要去为后者。
¹ Devise::SessionsController#destroy
² Devise::Controllers::Helpers#sign_out_all_scopes
³ Devise::Controllers::Helpers#sign_out
⁴ Warden::Proxy#logout
在持续色器件的版本是不necesary覆盖会话控制器,而不是你可以使用:
config.sign_out_all_scopes = false
在devise.rb
文件,以获得所需的行为。
你可以只覆盖设计的SessionController,像我一样来保存购物车:
sessions_controller.rb
class SessionsController < Devise::SessionsController
def destroy
order_id = session[:order_id]
super
session[:order_id] = order_id
end
end
的routes.rb
devise_for :users, :controllers => { :sessions => "sessions" }
除了Mattheus。 该声明
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
也许是最好的一般登出声明,考虑到正在与多个角色中签的可能性。 如果,你的情况下,您的用户只需签署作为一个角色,并且要保留在signout在会议休息时,最简单的方法就是做:
$ git clone git://github.com/plataformatec/devise.git
$ cd devise
$ git branch my_devise
$ git checkout my_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"