Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 命令以清除Rails中基于cookie的会话存储_Ruby On Rails_Session_Cookies - Fatal编程技术网

Ruby on rails 命令以清除Rails中基于cookie的会话存储

Ruby on rails 命令以清除Rails中基于cookie的会话存储,ruby-on-rails,session,cookies,Ruby On Rails,Session,Cookies,我经常想清除Rails中的会话存储,特别是默认的基于cookie的会话存储。一些网站似乎认为 rake tmp:sessions:clear 完成此任务,但似乎没有。清除基于cookie的会话存储的正确方法是什么?我现在意识到,根据基于cookie的存储的实现方式,我想要的可能不可能实现。如果Cookie包含服务器所需的所有信息(包括数据完整性签名),则服务器不需要在其一侧存储任何信息,因此无法使现有Cookie无效。为了验证cookie是否有效,我假设cookie包含一些与服务器端数据对应的

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

rake tmp:sessions:clear

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

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


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

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


也许您可以在控制器中使用
会话。是否以某种方式清除
?不过,关于更改cookie密钥,您是对的。这样做将使属于旧密钥的任何会话无效。您必须从
ActionController::StaleSession
(或类似的东西)中解救出来,但它会起作用。

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

如果您使用基于cookie的会话

rake db:sessions:clear
rake tmp:sessions:clear
您可以更改rails应用程序的机密令牌。这将使所有现有会话无效

rake secret
然后将值复制到

RAILS_ROOT/config/initializers/session_store.rb
就这样。记住在此之后重新启动应用;)

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

rake db:sessions:clear
rake tmp:sessions:clear
如果使用基于文件的会话

rake db:sessions:clear
rake tmp:sessions:clear

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

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

SecureRandom.hex(64)
不要将生产密钥签入版本控制/GIT,而是使用环境变量。因此,在您的
config/secrets.yml
文件中,使用如下内容:

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
生产:
机密密钥库:

没错,正如我在评论中提到的,我错误地认为cookie只在客户端和服务器之间保留某种会话令牌,并且令牌也存储在服务器端以验证客户端令牌,或者数据在服务器端。暂时我只是在代码中有一个变通方法来忽略会话。也许最简单的方法是切换到开发环境的基于数据库的cookie存储(我只想为了开发目的而清除会话)。更改config.secret_令牌并重新启动服务器。Cookie会话已重置。结果。我必须将该值复制到secret_token.rb