Devise的HTTP身份验证会中断常规注销

时间:2014-01-28 17:50:57

标签: ruby-on-rails devise cross-browser logout http-basic-authentication

定期登录和退出在我的应用中运行正常。但是,当我使用HTTP身份验证登录以访问JSON或XML资源然后返回并单击“注销”按钮时,它会将我重定向到登录页面,但用户仍然可以登录并可以访问任何页面。在我完全关闭浏览器之前,它不会注销。 This article更好地解释了这个问题。设计是否有任何解决方法或这仍然是一个问题?

我一直在阅读很多关于它的内容并试过work arounds here但是除了IE以外没有用。有没有办法在用户注销时使http_authenticatable凭据到期?

以下是重现此问题的步骤。

  1. 启用HTTP身份验证(config / initializers / devise.rb中的config.http_authenticatable = true)
  2. 确保您已从应用程序注销。然后访问JSON或XML资源。例如在浏览器中打开localhost:3000 / products.json
  3. 浏览器将弹出一个消息框以输入用户名和密码。输入那些。
  4. 返回常规html页面。例如open localhost:3000 / products
  5. 点击退出
  6. 注意用户仍然会登录。即使删除了cookie !!
  7. 用户在完全关闭浏览器窗口之前无法注销,这可能是公共场所的安全问题。

    使用devise(2.1.2)和rails(3.2.16)进行测试

1 个答案:

答案 0 :(得分:0)

尝试在JSON / XML响应期间设置Cache-Control标头,使其无法缓存。也许这会阻止它缓存凭证。

更新了一个如何使所有API调用不可缓存的具体示例。

在ApplicationController中:

def set_uncacheable
  response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
end

before_filter :make_api_calls_uncacheable
def make_api_calls_uncacheable
  set_uncacheable if ['xml', 'json'].include?(request.format)
end