使用Devise in Rails注销特定用户

我有用于用户身份validation的Devise。 我想签出具有特定ID的用户。

在我的控制器中

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

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

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

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

注意:afaik sign_out方法仅适用于当前会话,或者可能通过warden(不知道warden足够好)它可以扩展到当前服务器曾经触及的所有会话。 但是:如果你使用乘客,或某种forms的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 ,但我不确定这是否会影响当前会话?

从设备api doc http://rubydoc.info/github/plataformatec/devise/master/Devise/Controllers/SignInOut#sign_out-instance_method中 ,sign_out(@user)方法应该有效。 有可能current_user偶然的id为5吗?