2013-03-08 20 views
5

Chcę ustawić podstawowe uwierzytelnianie dla ActiveAdmin, którego wewnętrzne rozwiązanie do projektowania nie ma zastosowania w moim przypadku. W tym celu chciałbym móc dodać oprogramowanie pośrednie do silnika ActiveAdmin, zanim zostanie on dołączony do mojej aplikacji. To, co udało mi się zrobić, to:ActiveAdmin: Jak skonfigurować podstawowe uwierzytelnianie HTTP?

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

Ale najwyraźniej to nie działa, ponieważ moje aktywne trasy administracyjne są nadal niezabezpieczone. Jak mogę to skutecznie zrobić? I nie, nie chcę chronić mojej witryny z podstawowym uwierzytelnianiem.

Odpowiedz

12

Oto kilka pomysłów:

# 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 

Lub wersja monkeypatching

# config/initializers/active_admin.rb 

# somewhere outside the setup block 

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

Jeśli chcesz tylko do ochrony określonych zasobów, można użyć bloku Kontroler:

# app/admin/users.rb 

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

    # ... 
end 

Miałem nadzieję, że będę w stanie rozszerzyć kontroler w ten sposób w config/initializers/active_admin.rb w blok konfiguracji, ale to nie dla mnie:

# app/admin/users.rb 

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

    # ... 
end 

Możecie spróbować chociaż, jak to może być sprawa wersja ActiveAdmin (Mógłbym przysiąc, że widziałem, że udokumentowane gdzieś ...)

Powodzenia, mam nadzieję, że to pomoże.

UPDATE: Kilka więcej opcji:

nie zdawał sobie sprawy, że: before_filter w activeadmin config zajmuje blok.

# 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 

I ... jeszcze jeden pomysł. Brzmi jak nie są chętni na dodanie czegoś do application_controller, ale ta wersja nie jest uzależnione jak pierwszy powyżej:

# 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

hej, dzięki za wpisanie wszystkich dostępnych opcji! Pierwszy to taki, którego znałem, ale nie chciał zaimplementować za wszelką cenę (warunkowe filtrowanie jest do bani, jest również oceniane przez wszystkie otwarte działania). Drugi to miły kandydat. Trzeci nie jest dokładnie moim przypadkiem użycia.Czwarty jest tym, czego oczekiwałbym (aczkolwiek nie z tą składnią) do wdrożenia za każdym razem, gdy aktywny zespół administracyjny zdaje sobie sprawę, że nie wszystkie aplikacje railsowe potrzebują/potrzebują systemu uwierzytelniania. Myślę, że pójdę z twoją drugą sugestią i zgłoś się do ciebie, gdy tylko będę miał ocenę. Jeszcze raz! – ChuckE

+0

@ChuckE: Wygląda na to, że druga opcja sprawdzi się dobrze. Właśnie dodałem kilka innych bazujących na 'authentication_method' i' before_filter'. Ten ostatni może być dobry, jeśli istnieje jakikolwiek inny sposób uwierzytelnienia dla administratorów ... Po ponownym przeanalizowaniu wszystkich tych informacji zdałem sobie sprawę, że podoba mi się pierwsza edycja (przy użyciu 'config.before_filter') Najlepiej. Powodzenia! –

+0

Jestem również twoim zdaniem, rozwiązanie, które pozostaje w domyślnym aktywnym inicjatorze administracyjnym, wydaje się być zwycięzcą! – ChuckE

-1

Jeśli chcesz po prostu zabezpieczyć obszar admin ActiveAdmin, to należy spróbować:

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

który działa jak czar ;-)

Baw

+0

Podlega atakowi czasu. Proszę zobaczyć http://codahale.com/a-lesson-in-timing-attacks/ – mbj

-1

tylko kolejnym rozwiązaniem dla Ciebie byłoby:

# 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 

Dużym plusem tego rozwiązania IST, które można nazwać

before_filter: uwierzytelniać

w każdej dziedzinie, którą chcesz protet.

+0

Nigdy, EVER sprawdzania poprawności poświadczeń za pomocą ciągu # == jest poddawany atakowi czasu. http://codahale.com/a-lesson-in-timing-attacks/ – mbj

Powiązane problemy