我正在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
非常感谢您可以提供的任何帮助!
答案 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)
def confirmed?
admin_user?
end
功能admin_user?必须为您的管理员用户返回true。