用于清除Rails中基于cookie的会话存储的命令

时间:2009-08-07 05:54:58

标签: ruby-on-rails session cookies

我经常想要清除Rails中的会话存储,特别是默认的基于cookie的会话存储。有些网站似乎暗示

rake tmp:sessions:clear

完成此任务,但似乎没有。清除基于cookie的会话存储的正确方法是什么?

5 个答案:

答案 0 :(得分:25)

如果您使用基于Cookie的会话

您可以更改rails应用的secret_token。这将使所有现有会话无效。

rake secret

然后将值复制到

RAILS_ROOT/config/initializers/session_store.rb

多数民众赞成。请务必在此之后重新启动您的应用;)

如果您使用基于数据库的会话

rake db:sessions:clear

如果您使用基于文件的会话

rake tmp:sessions:clear

答案 1 :(得分:9)

更改会话cookie的名称。它不会删除旧的cookie,但它会强制每个人获得一个新的会话cookie。

答案 2 :(得分:8)

问题在于cookie是客户端。在服务器上运行rake任务不会删除访问过该网页的所有计算机上的cookie。

也许您可以以某种方式在控制器中使用session.clear?不过,你改变cookie密钥是对的。这样做会使属于旧密钥的任何会话无效。你必须从ActionController::StaleSession(或类似的东西)拯救,但它会起作用。

答案 3 :(得分:3)

现在我发现根据基于cookie的商店的实现方式,我想要的可能是不可能的。如果cookie包含服务器所需的所有信息(包括数据完整性的签名),则服务器不需要在其侧存储任何信息,因此无法使现有cookie无效。我假设cookie包含一些与服务器端数据相对应的密钥,以验证cookie是否有效,但现在我意识到情况可能并非如此。

如果这是真的,那么清除cookie的唯一方法是更改​​用于签名的服务器端cookie密码,然后可能重新启动服务器进程。

答案 4 :(得分:1)

如果您在生产服务器上运行它,我建议:

rake secret

这只是生成随机安全令牌。 rake任务基本上是这样做的,你可以在控制台中完成。

SecureRandom.hex(64)

永远不要将生产密钥检查到版本控制/ GIT中,而是使用环境变量。因此,在config/secrets.yml文件中使用类似:

的内容
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>