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,只有当某个特定会话处于活动状态且会话销毁失效后才应该有效。
答案 0 :(得分:0)
当Angular应用程序调用url时,您传递的是什么方法?对于logout url,设备期望默认删除方法。尝试更改设备配置文件(config / initializers / devise.rb)并修改sign_out_via属性。默认情况下是:删除,您只需要更改为:get。
config/initializers/devise.rb
config.sign_out_via = :get