如何允许管理员用户伪装成尚未确认电子邮件的普通用户

时间:2019-06-23 11:55:24

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

我正在Ruby on Rails应用程序中使用Devise。我的系统中有两种类型的用户:“管理员”和“用户”。在我的应用程序中,我允许管理员用户通过登录来“伪装”或冒充用户。

class Admin::Users::MasqueradeController < Admin::BaseController
  load_and_authorize_resource :user, only: :create

  def create
      sign_in(:user, @user)
      redirect_to user_path(@user)
  end
end

这很好用,但是如果用户尚未确认电子邮件,则devise将立即在“ sign_in”方法中引发错误并返回默认值“您必须先确认电子邮件地址,然后才能继续。”。当“ current_admin_user”存在时,我需要找到一种跳过此检查的方法。

我当前的解决方案是将allow_unconfirmed_access_for设置为nil,但是这将关闭所有用户的检查。相反,我希望它仅在管理员当前登录时才跳过该检查。因此,我最终不得不在SessionsController级别上重新创建此检查,并只是确保它不会为管理员触发。这感觉很脏,也不是理想的解决方案。

config.allow_unconfirmed_access_for = nil

非常感谢您可以提供的任何帮助!

2 个答案:

答案 0 :(得分:0)

我不知道它是否可以工作,但是您可以尝试在@user上设置Confirmed_at。

class Admin::Users::MasqueradeController < Admin::BaseController
  load_and_authorize_resource :user, only: :create

  def create
      @user.confirmed_at = DateTime.now
      sign_in(:user, @user)
      redirect_to user_path(@user)
  end
end

或者实际更新一秒钟:

class Admin::Users::MasqueradeController < Admin::BaseController
  load_and_authorize_resource :user, only: :create

  def create
      @user.update(confirmed_at: DateTime.now)
      sign_in(:user, @user)
      @user.update(confirmed_at: nil)
      redirect_to user_path(@user)
  end
end

答案 1 :(得分:0)

user.rb

def confirmed?
  admin_user?
end

功能admin_user?必须为您的管理员用户返回true。