Comment puis-je protéger mon itinéraire / sidekiq par mot de passe (c.-à-d. Exiger une authentification pour l’outil Sidekiq :: Web)?

J’utilise sidekiq dans mon application de rails. Par défaut, Sidekiq est accessible à tout le monde en ajoutant “/ sidekiq” après l’URL. Je veux protéger / authentifier par mot de passe uniquement la partie sidekiq. Comment puis je faire ça?

    Mettez ce qui suit dans votre initialiseur sidekiq

    require 'sidekiq' require 'sidekiq/web' Sidekiq::Web.use(Rack::Auth::Basic) do |user, password| [user, password] == ["sidekiqadmin", "yourpassword"] end 

    Et dans le fichier routes:

     authenticate :user do mount Sidekiq::Web => '/sidekiq' end 

    Voir “Sécurité” sous https://github.com/mperham/sidekiq/wiki/Monitoring

    Sidekiq :: Web utilise Rack :: Protection pour protéger votre application contre les attaques Web classiques (telles que CSRF , XSS , etc.). Rack :: Protection invaliderait votre session et Forbidden erreur Forbidden si elle constate que votre demande ne répond pas aux exigences de sécurité. L’une des situations possibles est de faire en sorte que votre application fonctionne derrière un proxy inverse et ne lui transmette pas les en-têtes importants ( X-Forwarded-For , X-Forwarded-Proto ). Cette situation et cette solution peuvent être trouvées dans cet article et dans le numéro 2560 …

    Si vous utilisez Devise (ou une autre authentification basée sur Warden), vous pouvez le faire en supposant que vous avez un modèle AdminUser dans votre application.

     # config/routes.rb # This defines the authentication constraint constraint = lambda do |request| request.env['warden'].authenticate!({ scope: :admin_user }) end # This mounts the route using the constraint. # You could use any other path to make it less obvious constraints constraint do mount Sidekiq::Web => '/sidekiq' end 

    Désolé pour le retard à la fête, mais le wiki de Sidekiq recommande ce qui suit pour Devise:

    Pour autoriser tout User authentifié:

     # config/routes.rb authenticate :user do mount Sidekiq::Web => '/sidekiq' end 

    Pour restreindre l’access à User.admin?

     # config/routes.rb authenticate :user, lambda { |u| u.admin? } do mount Sidekiq::Web => '/sidekiq' end 

    Ce post wiki a également de nombreux autres schémas de sécurité.

    Cela a été testé avec Rails 5.1.3, Devise 4.3 et Sidekiq 5.0

    Si vous lancez votre propre authentification personnalisée, vous pouvez utiliser l’exemple ci-dessous qui est référencé dans les documents ici .

     # lib/admin_constraint.rb class AdminConstraint def matches?(request) return false unless request.session[:user_id] user = User.find request.session[:user_id] user && user.admin? end end # config/routes.rb require 'sidekiq/web' require 'admin_constraint' mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new 

    Une autre option serait d’append quelque chose comme CanCan et un access spécial en fonction des rôles.

    Si vous utilisez Sorcery pour l’authentification, voici comment utiliser les contraintes des routes Rails pour protéger certains itinéraires.


    Copié ici du wiki de sorcellerie pour la redondance:

    Ce tutoriel montre comment utiliser les contraintes des routes Rails avec la gemme de sorcellerie. Merci à @anthonator de l’ avoir écrit!

    Tout d’abord, définissez le module UserConstraint qui sera utilisé pour toutes les contraintes:

     module RouteConstraints::UserConstraint def current_user(request) User.find_by_id(request.session[:user_id]) end end 

    Puis, ayant ce module défini, vous pouvez spécifier des classes de contraintes spécifiques. Dans ces exemples, le premier itinéraire ne fonctionnera que s’il n’ya pas d’utilisateur connecté, le second ne fonctionnera que pour l’utilisateur connecté qui est administrateur:

     class RouteConstraints::NoUserRequiredConstraint include RouteConstraints::UserConstraint def matches?(request) !current_user(request).present? end end class RouteConstraints::AdminRequiredConstraint include RouteConstraints::UserConstraint def matches?(request) user = current_user(request) user.present? && user.is_admin? end end 

    Enfin, vous pouvez append les contraintes à config/routes.rb :

     MyApp::Application.routes.draw do # other routes … root :to => 'admin#dashboard', :constraints => RouteConstraints::AdminRequiredConstraint.new root :to => 'home#welcome', :constraints => RouteConstraints::NoUserRequiredConstraint.new end