Devise 的 HTTP 身份验证中断了常规注销
Posted
技术标签:
【中文标题】Devise 的 HTTP 身份验证中断了常规注销【英文标题】:Devise's HTTP authentication breaks regular sign out 【发布时间】:2014-02-20 04:35:12 【问题描述】:常规登录和退出在我的应用中运行良好。但是,当我使用 HTTP 身份验证登录以访问 JSON 或 XML 资源,然后返回并单击退出按钮时,它会将我重定向到登录页面,但用户仍处于登录状态并且可以访问任何页面。在我完全关闭浏览器之前它不会注销。 This article 总体上更好地解释了这个问题。设计是否有任何解决方法或者这仍然是一个问题?
我已经阅读了很多关于它的内容,并尝试了work arounds here,但除了 IE 之外没有其他工作。有没有办法在用户注销时使 http_authenticable 凭据过期?
这里是重现问题的步骤。
-
启用 HTTP 身份验证(config/initializers/devise.rb 中的 config.http_authenticable = true)
确保您已从应用程序中注销。然后访问 JSON 或 XML 资源。例如在浏览器中打开 localhost:3000/products.json
浏览器会弹出一个消息框输入用户名和密码。输入这些。
返回到常规的 html 页面。例如打开 localhost:3000/products
点击退出
注意用户仍然会登录。即使删除了cookie!!
用户在完全关闭浏览器窗口之前无法退出,这可能是公共场所的安全问题。
使用 devise (2.1.2) 和 rails (3.2.16) 进行测试
【问题讨论】:
【参考方案1】:尝试在您的 JSON / XML 响应期间设置 Cache-Control
标头以使其不可缓存。也许这也会阻止它缓存凭据。
更新一个具体示例,说明如何使所有 API 调用不可缓存。
在应用控制器中:
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
【讨论】:
我应该在 Rails 应用程序的哪个位置添加此标头,以便所有 JSON/XML 都可以拥有它? 我还没有尝试过,但我怀疑你可以执行以下操作:在ApplicationController
中,定义set_uncacheable
,如我上面的答案所示。然后在ApplicationController
中添加一个名为set_uncacheable_for_api_calls
的before_filter,类似于set_uncacheable if ['xml', 'json'].include?(request.format)
它正在缓存,或者更多的是浏览器只是持有并重新发送 HTTP AUTH 标头与任何请求。
我尝试发送标头 Cache-Control 仍然不行。浏览器仍在缓存信息。我可以使用这个 js 命令在 IE 中进行 HTTP Auth 注销:document.execCommand('ClearAuthenticationCache', 'false')
但是,它不适用于 Chrome、FF 和所有其他...以上是关于Devise 的 HTTP 身份验证中断了常规注销的主要内容,如果未能解决你的问题,请参考以下文章