Devise 身份验证 gem 的经典应用程序结构是仅限服务器端的 Rails 应用程序。在这种情况下,当一个人退出时,没有任何东西可以防止会话破坏。
但我正在使用 Rails+Devise+Angular.js 并尝试以正确的方式退出 - 这意味着 - /users/sign_out
URL 必须由 Angular 应用程序调用,而不是通过单击<a href="/users/sign_out">
链接。
我的应用程序以块的形式加载数据。如果在调用 /users/sign_out URL 时某些数据请求尚未完成,则 Devise 重新登录用户。
我做了我的自定义注销方法,看看会发生什么:
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
真的是nil
,但是接下来对 data_request 的请求就before_filter
好像我没有注销一样通过。
如果您能帮助我了解发生了什么以及如何实现可靠的注销,我将不胜感激。
更新
我遇到了一个奇怪的行为:
如果我停止 Webrick 服务器,重新启动它并重新加载页面,应用程序允许我调用 API 方法,就好像会话没有被破坏一样。据我所知,Devise 的身份验证 cookie 不包含加密/编码的登录名和密码,而是代表一个临时会话 ID,该 ID 仅在特定会话处于活动状态且会话销毁后应变为无效时才有效。