【问题标题】:How to allow admin users to masquerade as regular users who have not confirmed their email如何允许管理员用户伪装成未确认电子邮件的普通用户
【发布时间】:2019-06-23 11:55:24
【问题描述】:

我在 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

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

【问题讨论】:

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


    【解决方案1】:

    我不知道它是否会起作用,但你可以尝试在@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
    

    【讨论】:

    • 这适用于初始登录,但确认的_at实际上被检查了很多次。因此,一旦您点击下一页,它就会执行相同的操作。
    【解决方案2】:

    user.rb

    def confirmed?
      admin_user?
    end
    

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

    【讨论】:

    • 不要相信这行得通。当管理员登录到另一个帐户时,管理员用户不是被检查的用户。管理员 A 伪装成用户 B,正在检查用户 B 是否已确认其帐户。
    • 伪装成用户B,切换用户,同时保留一些cookie识别管理员用户的过程是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多