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)?