从Rails App为某些用户设计强制注销

时间:2017-02-04 07:22:43

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

是否可以通过Devise强制注销某些用户。

在我的设置中,我使用的是带有Devise 1.5.4的rails 4.1.15。会话在db中保留,并且没有与用户ID的直接映射。是否有一种设计方式可以注销一些不是全部的用户。

我尝试将密码重置为代理,立即注销但不总是。

user_obj.update_attributes(:password => "some_random_string")

2 个答案:

答案 0 :(得分:0)

我可以为您提出下一个解决方案。

为名为admin

force_logout:boolean添加新列

在任何控制器中添加新操作以将force_logout设置为true。例:

# in admins_controller.rb

def force_logout
  admin = Admin.find(params[:id])
  admin.update_column(:force_logout, true)
  redirect_to :back
end

如果application_controller.rbbefore_action

,请force_logout添加true以退出用户
before_action :check_force_logout

def check_force_logout
  if current_user && current_user.force_logout?
    current_user.update_column(:force_logout, false)
    sign_out(current_user)
  end
end

管理员登录后,您需要重置force_logout列。通常,您可以session_controller.rb执行create

答案 1 :(得分:0)

是时候挖掘这个了。我能够解决此问题的唯一方法是访问会话。它很慢,但是有效。

  def sign_out_different_user
    @user = User.find(params[:id])
    sessions = ActiveRecord::SessionStore::Session.where("updated_at > ?", Time.now - 480.minutes).all
    sessions.each do |s|
      if s.data['user_email'] == @user.email
        s.delete and return
      end
    end
  end

出于我的需要,我需要更改用户对象的会话到期时间,因此也将其添加到方法中。 YMMV

 @user.session_expires_at = Time.now
 @user.save