8 votes

ActiveAdmin : Comment configurer l'authentification de base HTTP ?

Je veux définir l'authentification de base pour ActiveAdmin, ce que la solution de la devise interne n'applique pas à mon cas. Pour cela, j'aimerais pouvoir ajouter un middleware au moteur ActiveAdmin avant qu'il ne soit intégré à mon application. Voici ce que j'ai réussi à faire :

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

Mais apparemment, cela ne fonctionne pas, puisque mes routes d'administration actives ne sont toujours pas protégées. Comment puis-je faire cela efficacement ? Et non, je ne veux pas protéger l'ensemble de mon site avec une authentification de base.

20voto

Amiel Martin Points 1843

Voici quelques idées :

# 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

Ou, la version monkeypatching

# config/initializers/active_admin.rb

# somewhere outside the setup block

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

Si vous souhaitez uniquement protéger des ressources spécifiques, vous pouvez utiliser le bloc contrôleur :

# app/admin/users.rb

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

  # ...
end

J'espérais pouvoir étendre le contrôleur de cette manière dans config/initializers/active_admin.rb dans le bloc de configuration, mais cela n'a pas fonctionné pour moi :

# app/admin/users.rb

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

  # ...
end

Vous pouvez cependant essayer, car il pourrait s'agir d'un problème de version d'ActiveAdmin (j'aurais juré avoir vu cela documenté quelque part...).

Bonne chance, j'espère que cela vous aidera.

UPDATE : Quelques options supplémentaires :

Je n'avais pas réalisé auparavant que :before_filter dans la configuration activeadmin prend un bloc.

# 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

Et... juste une autre idée. On dirait que vous ne tenez pas à ajouter quoi que ce soit à application_controller, mais cette version n'est pas conditionnelle comme la première ci-dessus :

# 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

-1voto

RailsZilla.com Points 55

Si vous voulez simplement protéger la zone d'administration d'ActiveAdmin, vous devriez essayer ceci :

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

cela fonctionne comme un charme ;-)

s'amuser

-1voto

RailsZilla.com Points 55

Une autre solution pour vous serait :

  # 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

le gros avantage de cette solution est que vous pouvez appeler

avant_filtre :authentification

dans tous les domaines que vous voulez protéger.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X