我经常想要清除Rails中的会话存储,特别是默认的基于cookie的会话存储。有些网站似乎暗示
rake tmp:sessions:clear
完成此任务,但似乎没有。清除基于cookie的会话存储的正确方法是什么?
答案 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"] %>