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

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

rake tmp:sessions:clear 

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

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

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

如果您使用基于Cookie的会话

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

 rake secret 

然后将值复制到

 RAILS_ROOT/config/initializers/session_store.rb 

而已。 请记住在此之后重新启动您的应用;)

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

 rake db:sessions:clear 

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

 rake tmp:sessions:clear 

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

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

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

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

 rake secret 

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

 SecureRandom.hex(64) 

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

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