我的应用程序要求用户在其浏览器的不同选项卡中登录不同的帐户(我们专门针对 Chrome)。因为 Rails 使用 cookie 来存储 session 信息,所以当用户登录时,他们会在浏览器的所有选项卡上登录。我正在使用 ActiveRecord session 存储方法,但即使 session 的 ID 也保存为 cookie。
似乎有一个使用 HTML5 的 sessionStorage 机制的解决方案,它的范围仅限于用户登录的选项卡或窗口。看来我所要做的就是指示 Rails 将 session 信息保存到 sessionStorage 而不是 cookie 中。但是我根本找不到这方面的信息。
假设没有办法在 Rails 中配置 session 存储来执行此操作,是否可以覆盖 ActiveRecord session 保存机制?关于在何处查找有关如何解决此问题的信息的任何指示?
最佳答案
与 cookie 不同,sessionStorage 条目不能使用响应 header 创建,并且不会自动包含在请求 header 中。这给在客户端 Javascript 上管理基于 sessionStorage/localStorage 的身份验证带来了很多工作量。所有经过身份验证的访问都必须通过明确包含身份验证 token 的 Javascript XHR 请求。
如果您希望用户能够有多个并发 session ,并且您不想将您的站点构建为 SPA ,那么您将不得不对 cookie 采取替代方法。
一种方法是使用多个域强制将 cookie 放入单独的子空间。设置通配符 DNS 记录并将您的 Web 服务器配置为接受所有匹配的请求,而不考虑前缀。例如,用户可能默认位于 www.yoursite.com
。您将提供一个“创建新 session ”链接,该链接会打开一个指向随机子域的新选项卡,例如1234abcd.www.yoursite.com
。但是,如果您使用 SSL,这可能会产生问题;通配符 SSL 证书往往要贵得多。
一种更简单的方法是让用户了解他们浏览器的隐私/隐身模式,这些模式维护独立的 cookie 存储。然而,让用户阅读文档始终是一个挑战。
关于ruby-on-rails - Rails ActiveRecord session 存储在 HTML5 SessionStorage 而不是 Cookie 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18316752/