1

Devise 身份验证 gem 的经典应用程序结构是仅限服务器端的 Rails 应用程序。在这种情况下,当一个人退出时,没有任何东西可以防止会话破坏。

但我正在使用 Rails+Devise+Angular.js 并尝试以正确的方式退出 - 这意味着 - /users/sign_outURL 必须由 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 仅在特定会话处于活动状态且会话销毁后应变为无效时才有效。

4

1 回答 1

0

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

config/initializers/devise.rb
config.sign_out_via = :get
于 2013-04-12T14:18:49.487 回答