12

我的应用程序要求用户在浏览器的不同选项卡中登录不同的帐户(我们专门针对 Chrome)。因为 Rails 使用 cookie 来存储会话信息,所以当用户登录时,他们会登录浏览器中的所有选项卡。我正在使用 ActiveRecord 会话存储方法,但即使会话的 ID 也保存为 cookie。

使用 HTML5 的 sessionStorage 机制似乎有一个解决方案,该机制的范围仅限于用户登录的选项卡或窗口。看来我所要做的就是直接 Rails 将会话信息保存到 sessionStorage 而不是 cookie 中。但我根本找不到这方面的信息。

假设没有办法在 Rails 中配置会话存储来执行此操作,是否可以覆盖 ActiveRecord 会话保存机制?关于在哪里查找有关如何执行此操作的信息的任何指示?

4

2 回答 2

2

与 cookie 不同,sessionStorage 条目不能使用响应标头创建,并且不会自动包含在请求标头中。这为在客户端 Javascript 上管理基于 sessionStorage/localStorage 的身份验证带来了很多工作量。所有经过身份验证的访问都必须通过显式包含身份验证令牌的 Javascript XHR 请求。

如果您希望用户能够有多个并发会话,并且您不想将您的网站构建为SPA,那么您将不得不采用 cookie 的替代方法。

一种方法是使用多个域来强制 cookie 进入单独的子空间。设置通配符 DNS 记录并将您的 Web 服务器配置为接受所有匹配的请求,而不考虑前缀。例如,用户可能默认位于www.yoursite.com. 您将提供一个“创建新会话”链接,该链接打开一个随机子域的新选项卡,例如1234abcd.www.yoursite.com. 但是,如果您使用 SSL,这可能会产生问题;通配符 SSL 证书往往要贵得多。

一种更简单的方法是让用户了解他们浏览器的私有/icognito 模式,这些模式维护独立的 cookie 存储。然而,让用户阅读文档始终是一个挑战。

于 2017-03-01T17:17:35.840 回答
-1

您现在通过初始化程序配置基于 Cookie 的会话存储,可能在config/initializers/session_store.rb中。在 Rails 3 中,会话存储是一个中间件,配置选项通过一次调用 config.session_store 传入:

你的::Application.config.session_store :cookie_store, :key => '_session'

您可以使用 :key 在散列中添加您想要的任何额外选项,例如

Your::Application.config.session_store :cookie_store, {
  :key =>           '_session_id',
  :path =>          '/',
  :domain =>        nil,
  :expire_after =>  nil,
  :secure =>        false,
  :httponly =>      true,
  :cookie_only =>   true
}
于 2013-08-20T11:45:58.497 回答