Sidekiq 网页面板显示禁止

Sidekiq web panel shows forbidden

我在我的 Sinatra 应用程序中安装了 Sidekiq 面板,如下所示:

require 'rubygems'
require 'bundler'
require 'sidekiq/web'

env = ENV['RACK_ENV'].to_sym || :development

Bundler.require(:default, :sinatra, env)
disable :run
Encoding.default_external = Encoding::UTF_8

set :environment, env

use Rack::ShowExceptions
use Rack::Session::Pool
use Rack::MethodOverride

Sidekiq::Web.use Rack::Session::Pool

require File.expand_path '../app/my_app.rb', __FILE__
run Rack::URLMap.new("/" => MyApp.new, "/sidekiq" => Sidekiq::Web.new)

这意味着我的应用程序可以通过 / 访问,sidekiq 网络面板可以通过 /sidekiq 访问。

现在,当我尝试删除作业时,总是得到 Forbidden。我在此处阅读 https://github.com/mperham/sidekiq/issues/1289 and here https://github.com/mperham/sidekiq/issues/2487,但无论是升级到 rack-protection > 1.5.1 还是为 Sidekiq::Web 设置会话,到目前为止都解决了问题。

我正在使用 WEBrick rackup 启动我的服务器,所以我认为这不应该是服务器问题。

我将 sinatra 1.4.2 与 sidekiq 3.5.1 一起使用。关于如何解决这个问题的任何想法?

我找到了解决办法。首先,我从 sidekiq 3.4.2 更新到 4.0.1,从 sinatra 1.4.2 更新到 1.4.6。目前没有问题。

Forbidden 消息的问题是 sidekiq 的网络面板缺少真实性令牌。通过添加以下行,它起作用了:

require 'rubygems'
require 'bundler'
require 'sidekiq/web'

#####################################
# added a require for rack/protection
require 'rack/protection'
#####################################

env = ENV['RACK_ENV'].to_sym || :development

Bundler.require(:default, :sinatra, env)
disable :run
Encoding.default_external = Encoding::UTF_8

set :environment, env

use Rack::ShowExceptions
use Rack::Session::Pool
use Rack::MethodOverride
#####################################
# tell sinatra to use rack's protection methods
use Rack::Protection
#####################################

require File.expand_path '../app/my_app.rb', __FILE__
run Rack::URLMap.new("/" => MyApp.new, "/sidekiq" => Sidekiq::Web.new)

另请查看 https://github.com/sinatra/rack-protection,其中列出了所有保护方法。

您可能需要将此添加到 application.rb(或像 config/initializers/sidekiq.rb 这样的初始值设定项):

Sidekiq::Web.instance_variable_get(:@middleware).delete_if do |middleware|
  middleware.first == Rack::Protection
end

来自 recent commit,但仅适用于生产和暂存环境。

Detailed explanation关于这个问题。