Ограничения маршрута ActiveAdmin и Warden - PullRequest
0 голосов
/ 18 октября 2019

Мы недавно обновились до ActiveAdmin 1.1.0 на сайте, который поддерживает две отдельные модели пользователей - Users и AdminUsers. ActiveAdmin аутентифицирует AdminUsers, а остальная часть сайта аутентифицирует пользователей. Оба пути используют Devise, вот так:

  devise_for :users, controllers: {sessions: :practitioner_sessions, passwords: :practitioner_passwords}

  admin_devise_config = ActiveAdmin::Devise.config
  admin_devise_config[:controllers][:sessions] = :sessions

  devise_for :admin_users, admin_devise_config

Теперь у меня установлен механизм Rails (Resque :: Server), который я хочу ограничить администраторами, используя ограничение маршрутизации, подобное этому в config/routes.rb:

module RouteConstraint
  class Admin
    def self.matches?(request)
      request.env['warden'].user && request.env['warden'].user.admin?
    end
  end
end

  mount ResqueWeb::Engine, :at => "/resque", :constraints => RouteConstraint::Admin

Это раньше работало. Однако теперь, когда AdminUser вошел в ActiveAdmin, request.env['warden'].user возвращает nil, а request.env['warden'].authenticated? возвращает false.

Куда мне обратиться, чтобы проверить, прошел ли пользователь проверку подлинности с ActiveAdmin в этой конфигурации

1 Ответ

0 голосов
/ 04 ноября 2019

Раздел "scopes" вики Warden дал мне подсказки, необходимые для переписывания двух ограничений маршрута. Вместо того чтобы запрашивать метод user объекта Warden, я передал соответствующие области разработки в качестве аргументов методу authenticated?(). Помните, что области применения Devise можно найти в routes.rb, например:

devise_for :admin_users, admin_devise_config

devise_scope :admin_user do
  # some stuff
end

Так что тогда ограничения можно записать так:

module RouteConstraint
  class SuperAdmin
    def self.matches?(request)
      warden = request.env['warden']
      warden.authenticated?(:admin_user)
    end
  end
end

module RouteConstraint
  class LoggedIn
    def self.matches?(request)
      warden = request.env['warden']
      warden.authenticated?(:user) || warden.authenticated?(:admin_user)
    end
  end
end

Тогда я смог использовать ограничениятак же, как и раньше:

  mount Resque::Server, :at => "/resque", :constraints => RouteConstraint::SuperAdmin
  mount JobState::Engine, :at => "/job_state", :constraints => RouteConstraint::LoggedIn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...