2012-09-04 20 views
42

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

75

Đặ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 
+2

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

13

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 articleissue #2560 ...

7

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 
0

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ò.

0

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 
+0

ok @kleopatra, thế nào? :-) – AlexChaffee

3

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 
4

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