使用Devise in Rails注销特定用户

时间:2014-06-24 13:13:24

标签: ruby-on-rails ruby ruby-on-rails-4 devise

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

在我的控制器中

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

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

2 个答案:

答案 0 :(得分:6)

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

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

注意: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))

还有其他方法:

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

答案 1 :(得分:0)

来自设备api doc http://rubydoc.info/github/plataformatec/devise/master/Devise/Controllers/SignInOut#sign_out-instance_method

sign_out(@user)方法应该有效。 current_user是否可能具有id 5?