Rails ActiveRecord 会话存储在 HTML5 SessionStorage 中而不是 Cookie

Posted

技术标签:

【中文标题】Rails ActiveRecord 会话存储在 HTML5 SessionStorage 中而不是 Cookie【英文标题】:Rails ActiveRecord Session Store in HTML5 SessionStorage Instead of Cookie 【发布时间】:2013-08-21 10:10:43 【问题描述】:

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

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

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

【问题讨论】:

你找到这个问题的答案了吗? 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

您现在通过初始化程序配置基于 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

【讨论】:

我在这里配置会话存储并使用 ActiveRecord 会话存储。我将如何管理它以保存在 HTML5 sessionStorage 而不是 cookie 中?

以上是关于Rails ActiveRecord 会话存储在 HTML5 SessionStorage 中而不是 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Rails 中的查询中排除 id 数组(使用 ActiveRecord)?

Rails,activerecord,从 hstore 记录中删除键值对

会话存储在 Rails 中的啥位置?

Rails:如何在会话中存储数据?

在 Rails 中存储持久会话数据而不影响正常会话过期

在 Rails 的会话中存储对象