【问题标题】:Sidekiq web panel shows forbiddenSidekiq 网页面板显示禁止
【发布时间】:2016-06-21 08:11:32
【问题描述】:

我在我的 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 和这里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-failures gem (github.com/mhfs/sidekiq-failures) 时,我注意到一件事,它表现出相同的行为 Forbidden

标签: ruby sinatra rack sidekiq


【解决方案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,其中列出了所有保护方法。

【讨论】:

    【解决方案2】:

    您可能需要将此添加到 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关于这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      相关资源
      最近更新 更多