使用Devise in Rails注销特定用户

Dem*_*nou 5 ruby ruby-on-rails devise ruby-on-rails-4

我有用于用户身份验证的Devise.我想签出具有特定ID的用户.

在我的控制器中

  def exit
    @user = User.find(5)
    sign_out(@user) # this line here signs out the current_user   
  end
Run Code Online (Sandbox Code Playgroud)

设计的注销命令,即使我通过@user,它也会注销current_user.如何从数据库中选择用户并使用设计命令将其签名?

nat*_*vda 7

我假设这是一些管理模块的一部分,你想要签署一个特定的用户.

但是,这并不容易解决.是否登录用户存储在会话中.因此,要签出其他用户,您必须有权访问其会话.

注意:afaik sign_out方法仅适用于当前会话,或者可能通过warden(不知道warden足够好)它可以扩展到当前服务器曾经触及的所有会话.但是:如果你使用乘客或某种形式的rails服务器集群(这很常见),afaik这将无效.我会有兴趣听到其他方面的解释:) sign_out使用给定的参数来确定从(afaik)当前会话中退出的范围.

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

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

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

@session = ActiveRecord::Base.connection.select_all( "SELECT * FROM sessions WHERE session_id = '#{sess_id}'" )
Marshal.load(ActiveSupport::Base64.decode64(@session.data))
Run Code Online (Sandbox Code Playgroud)

还有其他方法:

  • 使用Timeoutable模块,并强制用户超时?
  • 如果你使用Rememberable你可以做@user.forget_me,但我不确定这实际上会影响当前的会话?