Ruby on rails 在Rails中使用Desive注销特定用户

Ruby on rails 在Rails中使用Desive注销特定用户,ruby-on-rails,ruby,ruby-on-rails-4,devise,Ruby On Rails,Ruby,Ruby On Rails 4,Devise,我设计了一个用户认证系统。 我想注销具有特定id的用户 在我的控制器中 def exit @user = User.find(5) sign_out(@user) # this line here signs out the current_user end designe的注销命令,即使我通过@user,它也会注销当前的用户。 如何从数据库中选择一个用户并使用designe命令将其注销 我假设这是某个管理模块的一部分,您想在其中注销某个特定用户 然而,这并不容易

我设计了一个用户认证系统。 我想注销具有特定id的用户

在我的控制器中

  def exit
    @user = User.find(5)
    sign_out(@user) # this line here signs out the current_user   
  end
designe的注销命令,即使我通过@user,它也会注销当前的用户。
如何从数据库中选择一个用户并使用designe命令将其注销

我假设这是某个管理模块的一部分,您想在其中注销某个特定用户

然而,这并不容易解决。用户是否登录将存储在会话中。因此,要注销另一个用户,您必须能够访问其会话

注意:如果
注销
方法仅在当前会话中有效,或者可能通过warden(不太了解warden)有效,它可以扩展到当前服务器曾经接触过的所有会话。但是:如果您使用passenger,或者某种形式的rails服务器集群(这是非常常见的),afaik这将不起作用。我想听听其他的解释:)注销
使用给定的参数来确定从当前会话中注销(afaik)的范围

所以我们通常会添加一种紧急按钮来注销所有用户:这会破坏所有会话。注意:这当然只有在使用数据库或文档存储支持的会话存储时才可能实现

或者,您可以打开所有会话,查找正确的会话(针对您的用户),然后销毁这些会话

要从存储在activerecord中的特定会话中读取数据,可以编写以下命令:

@session = ActiveRecord::Base.connection.select_all( "SELECT * FROM sessions WHERE session_id = '#{sess_id}'" )
Marshal.load(ActiveSupport::Base64.decode64(@session.data))
有其他办法:

  • 使用
    Timeoutable
    模块,并强制用户超时
  • 如果您使用
    Rememberable
    ,您可以使用
    @user.遗忘我
    ,但我不确定这是否会影响当前会话

从设备api文档中,注销(@user)方法应该可以工作。当前用户是否可能碰巧拥有id 5?

您是在测试中还是在开发/生产环境中签出用户?目的是什么?是否确定已设置
@user
会话请参见。