25

在 Heroku 上托管这个 Rails 应用程序的某个神秘点 X,一个登录的用户会突然以另一个用户的身份登录。我正在使用设计 gem 进行身份验证。

这发生在我们知道的 2 个用户身上。我目前正在追查这个问题的根本原因可能是什么。

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

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

还有其他想法吗?

4

9 回答 9

25

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

YourApp::Application.config.session_store :cookie_store, key: '_change_me_session'
于 2013-05-06T20:29:33.837 回答
17

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

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

rake db:sessions:clear

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

于 2013-05-06T20:37:29.027 回答
6

更新接受的答案,现在是

rake tmp:clear

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

于 2017-06-16T13:50:06.307 回答
4

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

rake db:sessions:clear
于 2013-05-06T20:07:14.867 回答
1

设计有一个叫做超时的东西你能用它吗?

于 2013-05-06T20:01:23.720 回答
1

查看

  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 登录用户?

于 2013-05-06T20:04:52.827 回答
0

在您的控制器操作上尝试此操作。

  def index
    reset_session
  end
于 2021-11-02T22:21:33.153 回答
0

sign_out_all_scopes(lock = true) ⇒ 对象

注销所有活动用户或范围。这个助手对于一键退出所有角色很有用。这会注销warden 中的所有范围。如果至少有一次注销,则返回 true;如果在所有范围内都没有用户登录,则返回 false。

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

于 2016-03-10T11:48:38.933 回答
0

当使用 cookie 存储时,我们必须重新生成用于加密 cookie 的应用程序 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

于 2017-11-08T05:48:49.700 回答