ActiveAdmin:如何设置HTTP基本身份验证?

Chu*_*ckE 6 ruby-on-rails rack-middleware activeadmin

我想为ActiveAdmin设置基本身份验证,内部设计解决方案不适用于我的情况.为此,我希望能够将中间件添加到ActiveAdmin引擎,然后将其捆绑到我的应用程序中.我设法做的是:

ActiveAdmin::Engine.configure do |config|
  config.middleware.use Rack::Auth::Basic do |username, password|
    username == 'admin' && password == 'root'
  end  
end
Run Code Online (Sandbox Code Playgroud)

但显然这不起作用,因为我的主动管理路线仍未受到保护.我怎样才能有效地做到这一点?不,我不想用基本身份验证保护我的整个网站.

Ami*_*tin 15

这里有一些想法:

# app/controllers/application_controller.rb

class ApplicationController < ActionController::Base

  # ...
  http_basic_authenticate_with :name => "frodo", :password => "thering", :if => :admin_controller?

  def admin_controller?
    self.class < ActiveAdmin::BaseController
  end
Run Code Online (Sandbox Code Playgroud)

或者,monkeypatching版本

# config/initializers/active_admin.rb

# somewhere outside the setup block

class ActiveAdmin::BaseController
  http_basic_authenticate_with :name => "frodo", :password => "thering"
end
Run Code Online (Sandbox Code Playgroud)

如果您只想保护特定资源,可以使用控制器块:

# app/admin/users.rb

ActiveAdmin.register Users do
  controller do
    http_basic_authenticate_with :name => "frodo", :password => "thering"
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)

我希望我能够config/initializers/active_admin.rb在设置块中以这种方式扩展控制器,但这对我不起作用:

# app/admin/users.rb

ActiveAdmin.setup do |config|
  config.controller do
    http_basic_authenticate_with :name => "frodo", :password => "thering"
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)

你可以尝试一下,因为它可能是一个ActiveAdmin版本的东西(我可以发誓,我看到在某处记录...)

祝你好运,我希望这会有所帮助.

更新:更多选择:

我之前没有意识到:activeadmin配置中的before_filter需要一个块.

# config/initializers/active_admin.rb

ActiveAdmin.setup do |config|
  # ...
  config.before_filter do
    authenticate_or_request_with_http_basic("Whatever") do |name, password|
      name == "frodo" && password == "thering"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

而且......还有一个想法.听起来你并不热衷于向application_controller添加任何东西,但是这个版本没有像上面第一个那样有条件:

# app/controllers/application_controller.rb

class ApplicationController < ActionController::Base

  def authenticate_admin
    authenticate_or_request_with_http_basic("Whatever") do |name, password|
      name == "frodo" && password == "thering"
    end
  end
end



# config/initializers/active_admin.rb

ActiveAdmin.setup do |config|
  # ...
  config.authentication_method = :authenticate_admin
end
Run Code Online (Sandbox Code Playgroud)