2013-03-08 34 views
5

Tôi muốn đặt xác thực cơ bản cho ActiveAdmin, giải pháp nội bộ nào không áp dụng cho trường hợp của tôi. Đối với điều đó tôi muốn có thể thêm phần mềm trung gian vào ActiveAdmin Engine trước khi gói này được đưa vào ứng dụng của tôi. Những gì tôi quản lý để làm là:ActiveAdmin: Cách thiết lập xác thực cơ sở HTTP?

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

Nhưng dường như điều này không làm cho nó hoạt động, vì các tuyến quản trị hoạt động của tôi vẫn chưa được bảo vệ. Làm thế nào tôi có thể làm điều này một cách hiệu quả? Và không, tôi không muốn bảo vệ toàn bộ trang web của mình bằng xác thực cơ bản.

Trả lời

12

Dưới đây là một vài ý tưởng:

# 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 

Hoặc, phiên bản monkeypatching

# config/initializers/active_admin.rb 

# somewhere outside the setup block 

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

Nếu bạn chỉ muốn bảo vệ tài nguyên cụ thể, bạn có thể sử dụng các khối điều khiển:

# app/admin/users.rb 

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

    # ... 
end 

Tôi đã hy vọng rằng tôi sẽ có thể mở rộng bộ điều khiển theo cách này trong config/initializers/active_admin.rb trong khối thiết lập, nhưng điều này không làm việc cho tôi:

# app/admin/users.rb 

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

    # ... 
end 

Bạn có thể thử nó mặc dù, vì nó có thể là một điều phiên bản ActiveAdmin (Tôi có thể thề rằng tôi thấy rằng tài liệu ở đâu đó ...)

Chúc may mắn, tôi hy vọng điều này sẽ hữu ích.

UPDATE: Một cặp vợ chồng thêm nhiều lựa chọn:

Tôi đã không nhận ra trước đó: before_filter trong activeadmin cấu hình mất một khối.

# 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 

Và ... chỉ còn một ý tưởng nữa. Có vẻ như bạn không quan tâm đến thêm bất cứ điều gì để application_controller, nhưng phiên bản này là không có điều kiện như là người đầu tiên trên:

# 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 
+0

này, cảm ơn bạn đã liệt kê tất cả các tùy chọn có sẵn! Việc đầu tiên là một trong những tôi đã nhận thức được, nhưng không muốn thực hiện ở tất cả các chi phí (lọc có điều kiện hút, nó cũng được đánh giá bởi tất cả các hành động mở). Thứ hai là một ứng cử viên tốt đẹp. Thứ ba không phải là trường hợp sử dụng của tôi.Thứ tư là những gì tôi mong đợi (mặc dù không phải với cú pháp đó) được thực hiện bất cứ lúc nào nhóm quản trị hoạt động nhận ra không phải tất cả các ứng dụng đường ray đều có/cần một hệ thống xác thực. Tôi nghĩ rằng tôi sẽ đi với đề nghị thứ hai của bạn và báo cáo cho bạn trở lại ngay sau khi tôi có một đánh giá. Thx lần nữa! – ChuckE

+0

@ChuckE: Có vẻ như tùy chọn thứ hai sẽ hoạt động tốt cho bạn. Tôi chỉ cần thêm một vài chi tiết dựa trên 'authentication_method' và' before_filter'. Điều cuối cùng có thể là tốt nếu có bất cứ nơi nào khác bạn có thể muốn xác thực cho người dùng quản trị ... Sau khi xem xét tất cả chúng một lần nữa, tôi nhận ra rằng tôi nghĩ tôi thích chỉnh sửa đầu tiên (sử dụng 'config.before_filter') tốt. Chúc may mắn! –

+0

Tôi cũng theo ý kiến ​​của bạn, một giải pháp còn lại trong trình khởi chạy quản trị hoạt động mặc định có vẻ như là một người chiến thắng! – ChuckE

-1

Nếu bạn chỉ muốn bảo vệ khu vực admin của ActiveAdmin, thì bạn nên thử loại này:

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

hoạt động như một nét duyên dáng ;-)

vui chơi

+0

Bị tấn công theo thời gian. Vui lòng xem http://codahale.com/a-lesson-in-timing-attacks/ – mbj

-1

chỉ là một giải pháp cho bạn sẽ là:

012.
# 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 

cộng lớn cho ist giải pháp này, bạn có thể gọi

before_filter: xác thực

trong mọi lĩnh vực bạn muốn protet.

+0

Không bao giờ, EVER xác thực thông tin đăng nhập qua String # == điều này phải chịu một cuộc tấn công thời gian. http://codahale.com/a-lesson-in-timing-attacks/ – mbj

Các vấn đề liên quan