我想为ActiveAdmin设置基本身份验证,内部设计解决方案不适用于我的情况。为此,我希望能够将中间件添加到ActiveAdmin引擎,然后将其捆绑到我的应用程序中。我设法做的是:
ActiveAdmin::Engine.configure do |config|
config.middleware.use Rack::Auth::Basic do |username, password|
username == 'admin' && password == 'root'
end
end
但显然这并没有使它工作,因为我的主动管理路线仍然没有受到保护。我怎样才能有效地做到这一点?不,我不想用基本身份验证保护我的整个网站。
答案 0 :(得分:13)
以下是一些想法:
# 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版本的东西(我可以发誓,我看到在某处记录了......)
祝你好运,我希望这会有所帮助。更新:还有几个选项:
之前我没有意识到:activeadmin config中的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
而且......还有一个想法。听起来你并不热衷于向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
答案 1 :(得分:-1)
如果您只想保护ActiveAdmin的管理区域,那么您应该尝试这样做:
# app/admin/dashboard.rb
controller do
http_basic_authenticate_with :name => "mega-admin", :password => "supersecret"
end
就像魅力一样; - )
玩得开心
答案 2 :(得分:-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:authenticate
在你要保护的每个区域。