Ограничение маршрута ActiveAdmin и Warden

Недавно мы обновились до ActiveAdmin 1.1.0 на сайте, который поддерживает две разные модели пользователей — Users и AdminUsers. ActiveAdmin аутентифицирует AdminUsers, а остальная часть сайта аутентифицирует Users. Оба пути используют 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 в этой конфигурации?


person pjmorse    schedule 18.10.2019    source источник


Ответы (1)


Раздел "scopes" вики Warden дал мне подсказки, которые я необходимо переписать два ограничения маршрута. Вместо запроса метода user объекта Warden я передал соответствующие области Devise в качестве аргументов методу 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
person pjmorse    schedule 04.11.2019