Когда администратор входит в другую учетную запись пользователя, вы можете сохранить некоторые дополнительные данные в сеансе, что дает понять, что это режим super admin
.
def login_as(another_user)
return unless current_user.super_admin?
session[:super_admin_mode] = true
bypass_sign_in(another_user)
end
К сожалению, вы не можете получить доступ к session
в моделях Rails, но вы можете хранить необходимую информацию о сеансе в некоторой глобальной переменной для каждого запроса, доступной в моделях.Решение может быть таким:
module SessionInfo
def self.super_user_mode?
!!Thread.current[:super_user_mode]
end
def self.super_user_mode=(value)
Thread.current[:super_user_mode] = value
end
end
В ApplicationController:
class ApplicationController < ActionController::Base
before_filter :store_session_info
private
def store_session_info
SessionInfo.super_user_mode = session[:super_admin_mode]
end
end
В модели:
def active_for_authentication?
super && (activated? || SessionInfo.super_user_mode?)
end
Кроме того, вы должны убедиться, чтоФлаг :super_admin_mode
удаляется из session
, когда суперпользователь выходит из системы.Может быть, это происходит автоматически, я не уверен.Возможно, вам нужно будет сделать это вручную, переопределяя метод Devise::SessionsController#destroy
(см. Пример ниже)
def destroy
session[:super_admin_mode] = nil
super
end
Также прочтите это, чтобы лучше понять, как devise
обрабатывает сессию Остановить Devise от очистки сессии