并发请求未完成时无法注销Devise用户

时间:2013-04-12 13:33:22

标签: ruby-on-rails asynchronous devise angularjs logout

Devise身份验证gem的经典应用程序结构是仅服务器端的Rails应用程序。在这种情况下,当一个人注销时,什么都不会阻止会话破坏。

但我正在使用Rails + Devise + Angular.js并尝试以正确的方式注销 - 这意味着 - /users/sign_out URL必须由Angular应用程序调用,而不是点击{{1} }链接。

我的应用程序以块的形式加载数据。如果在调用/ users / sign_out URL时某些数据请求尚未完成,则Devise会重新登录用户。

我制作了自定义注销方法,看看会发生什么:

<a href="/users/sign_out">

before_filter :authenticate_user! def data_request ............. end def logout sign_out(current_user) if current_user puts 'Has not signed out!' else puts 'Has signed out!' end redirect_to '/users/sign_out' end 方法调用后,sign_out确实是current_user,但是对data_request的下一个请求会通过nil,就像我没有注销一样。< / p>

如果您帮助我了解会发生什么以及如何实施可靠的注销,我将不胜感激。

更新

我遇到了一个奇怪的行为:

如果我停止Webrick服务器,再次启动它并重新加载页面,应用程序允许我调用API方法,就好像会话没有被销毁一样。据我所知,Devise的身份验证cookie不包含加密/编码的登录名和密码,但代表一个临时会话ID,只有当某个特定会话处于活动状态且会话销毁失效后才应该有效。

1 个答案:

答案 0 :(得分:0)

当Angular应用程序调用url时,您传递的是什么方法?对于logout url,设备期望默认删除方法。尝试更改设备配置文件(config / initializers / devise.rb)并修改sign_out_via属性。默认情况下是:删除,您只需要更改为:get。

config/initializers/devise.rb
config.sign_out_via = :get