8

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

ActiveAdmin::Engine.configure do |config|
  config.middleware.use Rack::Auth::Basic do |username, password|
    username == 'admin' && password == 'root'
  end  
end

但显然这并不能使它起作用,因为我的活动管理路由仍然不受保护。我怎样才能有效地做到这一点?不,我不想通过基本身份验证来保护我的整个网站。

4

3 回答 3

19

这里有一些想法:

# 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

或者,monkeypatching 版本

# config/initializers/active_admin.rb

# somewhere outside the setup block

class ActiveAdmin::BaseController
  http_basic_authenticate_with :name => "frodo", :password => "thering"
end

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

# app/admin/users.rb

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

  # ...
end

我希望能够在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

不过,您可以尝试一下,因为它可能是 ActiveAdmin 版本的东西(我可以发誓我在某处看到了文档......)

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

更新:更多选择:

在那之前我没有意识到 :before_filter 在 activeadmin 配置中占用了一个块。

# 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

而且……还有一个想法。听起来您并不热衷于向 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
于 2013-03-11T18:57:12.247 回答
-1

如果你只是想保护 ActiveAdmin 的管理区域,那么你应该试试这个:

# app/admin/dashboard.rb
controller do
  http_basic_authenticate_with :name => "mega-admin", :password => "supersecret"
end

这就像一个魅力;-)

玩得开心

于 2014-02-04T20:44:00.257 回答
-1

另一个解决方案是:

  # app/controllers/application_controller.rb
  protected
  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      username == "admin" && password == "superpassword"
    end
  end

# config/initializers/active_admin.rb
config.before_filter :authenticate

此解决方案的最大优点是,您可以调用

before_filter :认证

在您想要保护的每个区域。

于 2014-02-04T21:05:44.217 回答