我怎样才能密码保护我的/ sidekiq路线(即要求authentication的Sidekiq :: Web工具)?
我在我的rails应用程序中使用sidekiq。 默认情况下,任何人都可以通过在URL后添加“/ sidekiq”来访问Sidekiq。 我想密码保护/只authenticationsidekiq部分。 我怎样才能做到这一点?
把以下放入你的sidekiq初始值设定项中
require 'sidekiq' require 'sidekiq/web' Sidekiq::Web.use(Rack::Auth::Basic) do |user, password| [user, password] == ["sidekiqadmin", "yourpassword"] end
请参阅https://github.com/mperham/sidekiq/wiki/Monitoring下的“安全性”;
Sidekiq :: Web使用Rack :: Protection来保护您的应用程序免受典型的Web攻击(例如CSRF , XSS等)。 如果Rack :: Protection发现您的请求不符合安全要求,则Rack :: Protection会使您的会话无效并引发
Forbidden
错误。 其中一种可能的情况是使您的应用程序在反向代理之后工作,而不是将重要的标题传递给它(X-Forwarded-For
,X-Forwarded-Proto
)。 这种情况和解决scheme可以在这篇文章和问题#2560中find …
如果您使用Devise(或其他基于Warden的身份validation),则可以这样做,假设您的应用程序中有一个AdminUser模型。
# 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
如果您正在滚动您自己的自定义身份validation,那么您可以使用此处的文档中引用的下面的示例。
# 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
对不起迟到晚会,但Sidekiq的维基build议以下为Devise:
要允许任何已authentication的User
:
# config/routes.rb authenticate :user do mount Sidekiq::Web => '/sidekiq' end
限制访问User.admin?
# config/routes.rb authenticate :user, lambda { |u| u.admin? } do mount Sidekiq::Web => '/sidekiq' end
这个wiki文章也有许多其他的安全scheme。
这是使用Rails 5.1.3,Devise 4.3和Sidekiq 5.0testing的
另一个select是添加像CanCan和基于angular色的特殊访问。
如果你使用Sorcery进行身份validation,下面介绍如何使用Rails路由约束来保护某些路由。
复制这里从巫术维基冗余:
本教程演示如何使用Sorcery gem来使用Rails路由约束。 感谢@anthonator写它!
首先,定义将用于所有约束的UserConstraint
模块:
module RouteConstraints::UserConstraint def current_user(request) User.find_by_id(request.session[:user_id]) end end
然后,定义该模块,您可以指定特定的约束类。 在这些例子中,第一条路由只在没有用户login的情况下工作,第二条路由仅对login的用户是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
最后,您可以将约束添加到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