Tôi đang sử dụng sidekiq trong ứng dụng đường ray của mình. Theo mặc định, Sidekiq có thể được truy cập bởi bất kỳ ai bằng cách thêm "/ sidekiq" sau url. Tôi muốn mật khẩu bảo vệ/xác thực chỉ phần sidekiq. Làm thế nào tôi có thể làm điều đó?Làm cách nào để bảo vệ mật khẩu/tuyến đường sidekiq của tôi (tức là yêu cầu xác thực cho Sidekiq :: công cụ Web)?
Trả lời
Đặt đoạn mã sau vào sidekiq bạn initializer
require 'sidekiq'
require 'sidekiq/web'
Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
[user, password] == ["sidekiqadmin", "yourpassword"]
end
Xem "Security" dưới https://github.com/mperham/sidekiq/wiki/Monitoring
Sidekiq :: Web sử dụng Rack::Protection để bảo vệ ứng dụng của bạn chống lại các cuộc tấn công web điển hình (ví dụ như CSRF, XSS, vv). Rack :: Protection sẽ làm mất hiệu lực phiên làm việc của bạn và gây ra lỗi
Forbidden
nếu phát hiện thấy yêu cầu của bạn không đáp ứng các yêu cầu bảo mật. Một trong những tình huống có thể xảy ra là ứng dụng của bạn hoạt động sau proxy ngược và không chuyển các tiêu đề quan trọng tới nó (X-Forwarded-For
,X-Forwarded-Proto
). Thực trạng và giải pháp như vậy có thể được tìm thấy in this article và issue #2560 ...
Nếu bạn đang sử dụng lập mưu (hoặc chứng thực Warden-based khác), bạn có thể làm điều này, giả sử bạn có một mô hình AdminUser trong ứng dụng của bạ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
Một tùy chọn khác là thêm nội dung như CanCan và quyền truy cập đặc biệt dựa trên vai trò.
Nếu bạn đang sử dụng Sorcery để xác thực, đây là how to use Rails routes constraints để bảo vệ các tuyến đường nhất định.
sao chép ở đây từ wiki phù thủy để dự phòng:
Hướng dẫn này cho thấy làm thế nào để sử dụng Rails tuyến đường khó khăn với Phù thủy đá quý. Nhờ có @anthonator để viết nó!
Thứ nhất, xác định UserConstraint
mô-đun sẽ được sử dụng cho tất cả các ràng:
Sau đó, có mô-đun mà xác định, bạn có thể chỉ định các lớp học hạn chế cụ thể. Trong những ví dụ, tuyến đường đầu tiên sẽ chỉ làm việc nếu không có người dùng đăng nhập, thứ hai sẽ làm việc chỉ dành cho người dùng đăng nhập là người một admin:
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
Cuối cùng, bạn có thể thêm các trở ngại đối với các 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
ok @kleopatra, thế nào? :-) – AlexChaffee
Nếu bạn đang lăn xác thực tùy chỉnh của riêng mình, thì bạn có thể sử dụng ví dụ bên dưới được tham chiếu trong tài liệu 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
Xin lỗi vì đã muộn để đảng, nhưng Sidekiq's wiki khuyến cáo sau đây cho lập mưu:
Để cho phép bất kỳ chứng thực User
:
# config/routes.rb
authenticate :user do
mount Sidekiq::Web => '/sidekiq'
end
Để hạn chế quyền truy cập vào User.admin?
# config/routes.rb
authenticate :user, lambda { |u| u.admin? } do
mount Sidekiq::Web => '/sidekiq'
end
This wiki post cũng có nhiều chương trình bảo mật khác.
này đã được thử nghiệm sử dụng Rails 5.1.3, Vạch 4.3 và Sidekiq 5,0
BTW-I đặt sau đây trong Gemfile của tôi vì vậy tôi sẽ không phải tự đòi hỏi sidekiq và sidekiq/web trong cả initializer và tệp routes.rb: "gem 'sidekiq', yêu cầu: ['sidekiq', 'sidekiq/web']" – odigity