首页 > 解决方案 > 如何允许管理员用户伪装成未确认电子邮件的普通用户

问题描述

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

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

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

标签: ruby-on-railsdevisedevise-confirmable

解决方案


我不知道它是否会起作用,但您可以尝试在@user.

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

推荐阅读