Разработать - bypass_sign_in без active_for_authentication?Перезвоните - PullRequest
0 голосов
/ 18 мая 2018

У меня есть функция неактивной учетной записи в моем приложении для обработки этого метода, я переопределяю active_for_authentication?, как показано ниже

def active_for_authentication?
  super && activated?
end

Но в моем приложении супер-администратор также может напрямую войти в учетную запись другого пользователя, будь тоактивен или не активен

bypass_sign_in(User.find(resource.id))

Я использовал вышеописанный метод для обходного входа, он позволяет мне напрямую входить только для активированного пользователя, когда я вхожу в систему для не активированного пользователя, он заходит в бесконечный цикл.

Любые решения для преодоления этой проблемы или не запускать active_for_authentication? обратный вызов, когда bypass_sign_in?

1 Ответ

0 голосов
/ 18 мая 2018

Когда администратор входит в другую учетную запись пользователя, вы можете сохранить некоторые дополнительные данные в сеансе, что дает понять, что это режим 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 от очистки сессии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...