ruby - remove - ¿Cómo puedo proteger con contraseña mi ruta/sidekiq(es decir, necesito autenticación para la herramienta Sidekiq:: Web)?
sidekiq password (7)
Estoy usando sidekiq en mi aplicación de rieles. Por defecto, cualquier persona puede acceder a Sidekiq agregando "/ sidekiq" después de la url. Quiero proteger / autenticar con contraseña solo la parte sidekiq. ¿Cómo puedo hacer eso?
Consulte "Seguridad" en https://github.com/mperham/sidekiq/wiki/Monitoring
Sidekiq :: Web usa Rack::Protection para proteger su aplicación contra ataques web típicos (como CSRF , XSS , etc.). Rack :: Protection invalidaría su sesión y generaría un error
Forbidden
si considera que su solicitud no cumple con los requisitos de seguridad. Una de las posibles situaciones es que su aplicación funcione detrás de un proxy inverso y no le pase encabezados importantes (X-Forwarded-For
,X-Forwarded-Proto
). Tal situación y solución se pueden encontrar en este artículo y número 2560 ...
Lamento llegar tarde a la fiesta, pero https://github.com/mperham/sidekiq/wiki/Monitoring recomienda lo siguiente para Devise:
Para permitir cualquier User
autenticado:
# config/routes.rb
authenticate :user do
mount Sidekiq::Web => ''/sidekiq''
end
Para restringir el acceso a User.admin?
# config/routes.rb
authenticate :user, lambda { |u| u.admin? } do
mount Sidekiq::Web => ''/sidekiq''
end
https://github.com/mperham/sidekiq/wiki/Monitoring también tiene muchos otros esquemas de seguridad.
Esto fue probado usando Rails 5.1.3, Devise 4.3 y Sidekiq 5.0
Otra opción sería agregar algo como CanCan y acceso especial basado en roles.
Pon lo siguiente en tu inicializador sidekiq
require ''sidekiq''
require ''sidekiq/web''
Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
[user, password] == ["sidekiqadmin", "yourpassword"]
end
Si está activando su propia autenticación personalizada, puede usar el ejemplo siguiente al que se hace referencia en los documentos here .
# 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
Si está utilizando Sorcery para la autenticación, aquí se explica cómo usar las restricciones de las rutas de Rails para proteger ciertas rutas.
Copiado aquí de la wiki de hechicería para redundancia:
Este tutorial muestra cómo usar las restricciones de rutas de Rails con la joya de Hechicería. ¡Gracias a @anthonator por escribirlo!
Primero, defina el módulo UserConstraint
que se usará para todas las restricciones:
module RouteConstraints::UserConstraint
def current_user(request)
User.find_by_id(request.session[:user_id])
end
end
Luego, al haber definido ese módulo, puede especificar clases de restricciones específicas. En estos ejemplos, la primera ruta solo funcionará si no hay ningún usuario conectado, la segunda solo funcionará para el usuario registrado que sea administrador:
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
Finalmente, puede agregar las restricciones a 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
Si está utilizando Devise (u otra autenticación basada en Warden), puede hacerlo, suponiendo que tiene un modelo AdminUser en su aplicación.
# 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