如何重置所有设计会话,以便每个用户都必须重新登录?

在heroku上托管此rails应用程序的某个神秘点X,登录用户将突然以另一个用户身份登录。 我正在使用devise gem进行身份validation。

这已经发生在我们所知道的2个用户身上。 我目前正在追查这个问题的根本原因。

我现在需要做的是使所有设计会话无效,以强制用户再次登录。 用户登录后,问题似乎消失了。

我尝试重置我的secret_token,但我没有被迫再次登录。 然后,我将我的网络dynos缩小,然后备份。 我也重新启动了应用程序。 所有尝试获取secret_token更改以重置会话。

还有其他想法吗?

如果您将会话存储在cookie中(默认),则更改session_token将起作用。

但是,如果您存储在active_record中,则可以通过以下方式删除所有会话:

rake db:sessions:clear 

然后:BAM! 没有更多的会议。

您应该能够更改会话cookie名称以使所有会话无效,这些会话位于config / initializers / session_store.rb中

 YourApp::Application.config.session_store :cookie_store, key: '_change_me_session' 

如果您的会话未存储任何其他关键信息,您可以清除会话:

 rake db:sessions:clear 

接受答案的更新,现在是

rake tmp:clear

rake -T ... rake tmp:create # Creates tmp directories for sessions, cache, sockets, and pids

Devise有一个叫做超时的东西你可以用吗?

查看

  module ClassMethods Devise::Models.config(self, :timeout_in) end 

我只是猜测你可以这样做:

 User.all.each do |user| user.timeout_in 1.second end 

但我不确定这是否仅管理新会议……而不是现有会议?

实际上这太复杂了..试试:

 User.all.each do |user| sign_out user end 

查看此文章使用Devise注销所有用户

要从控制台执行此类操作,您需要查看此示例并根据需要进行调整

如何使用Rails控制台中的Devise登录用户?

sign_out_all_scopes(lock = true)⇒对象

退出所有活动用户或范围。 此帮助程序对于一次单击即可注销所有角色非常有用。 这标志着监狱长的所有范围。 如果至少有一次注销,则返回true;如果没有用户在所有范围内登录,则返回false。

来源: http : //www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut

使用cookie存储时,我们必须重新生成用于加密cookie的app secret_token。

用于配置secret_token的文件: config/initializers/secret_token.rb

bundle exec rake secret可用于生成新的秘密令牌。

https://www.tigraine.at/2012/08/03/how-to-expire-all-active-sessions-in-rails-3