Rails 3 - 更改为 session_store :domain => :all 时的“无限”会话

Posted

技术标签:

【中文标题】Rails 3 - 更改为 session_store :domain => :all 时的“无限”会话【英文标题】:Rails 3 - "Infinite" Session when changing to session_store :domain => :all 【发布时间】:2011-07-10 02:08:02 【问题描述】:

我目前有基于 cookie 的会话。我正在尝试允许使用同一会话访问我系统上的所有子域,因此用户只需登录一次并被授予通过我的站点(section1.mysite.com、section2.mysite.com 等)的访问权限。

我已经像这样更新了我的 config/initializers/session_store.rb:

 Mysite::Application.config.session_store :cookie_store, :key => '_mysite_session', :domain => :all
 #Mysite::Application.config.session_store :cookie_store, :key => '_mysite_session'

注释掉的行显示了我之前的内容。现在,如果我在重新启动服务器时注销(没有保存 cookie 会话),这非常有用。但是,如果我有一个用于第一个配置的 cookie 会话,当我切换到 :domain => all 时,我无法销毁该会话。用户无限期登录,因为会话不会破坏。用户无法从已注释掉的会话配置上登录的会话中注销,并且一旦新配置到位,他们就会尝试注销。

我尝试过的事情: * 更改 security_token 似乎没有帮助 * 更改 session_store 密钥似乎没有帮助(我对此感到困惑......我认为它应该可以工作) * 对于我的一生,我不知道如何手动删除会话

无论我做什么,在我进行此更改之前登录的任何人都无法在我执行此更改后退出。

提前感谢您的帮助! 本

【问题讨论】:

【参考方案1】:

:domain 选项不应该是复数吗,如 :domains 中的那样?

在你的情况下,可以这样做:

Mysite::Application.config.session_store :cookie_store,
  :key => '_mysite_session', :domains => :all

为了摆脱持久会话,您可能需要清除浏览器 cookie。

更新:

要删除用户 cookie,请编辑以下 Rails 文件:

app/config/initializers/secret_token.rb:

Mysite::Application.config.secret_token= 'XXXXXXXXX...XXXXXXXXX'

【讨论】:

我很确定 ":domain" 是一个键,而 ":domains" 是不正确的。而且,我同意清除我自己的浏览器持久会话和 cookie 可以为我清除问题,但是我不能在所有用户的浏览器上执行此操作。更改域后需要手动删除会话cookie。 我为您的后一个问题添加了解决方案 为了阐明 Arnaud 的更新代码究竟是如何摆脱用户 cookie 的(以防它帮助试图理解“为什么?”的人) - 在更改 secret_token 之后,服务器基本上是在寻找一个那时不同的cookie。当它没有找到它时,它只是创建一个新的(完全忽略旧的)。

以上是关于Rails 3 - 更改为 session_store :domain => :all 时的“无限”会话的主要内容,如果未能解决你的问题,请参考以下文章

将 Rails 应用程序更改为生产环境

在新的 Rails 项目中从 SQLite 更改为 PostgreSQL

React on Rails - 如何将登录链接更改为注销链接?

由于缓存目录将所有权更改为 root,Rails 6 应用程序失败

如何在 Rails 迁移中将可空列更改为不可空?

在 Rails 中将 redirect_to 格式更改为 :js