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 nil
和 request.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
我们最近更新到 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 nil
和 request.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