ActiveAdmin 和 Warden 路由约束

ActiveAdmin and Warden route constraint

我们最近更新到 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 returns nilrequest.env['warden'].authenticated? returns false.

我在哪里可以检查用户是否通过 ActiveAdmin 在此配置中进行身份验证?

"scopes" section of the Warden wiki 给了我重写两个路由约束所需的线索。我没有查询 Warden 对象的 user 方法,而是将相关的 Devise 范围作为参数传递给 authenticated?() 方法。请记住,可以在 routes.rb 中找到 Devise 范围,例如:

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