config.middleware.insert_before的第三个参数是什么?

时间:2014-01-09 20:06:30

标签: ruby-on-rails http-authentication rack-middleware

我一直在config/environments/staging.rb中使用以下内容来保护我的staging环境:

# HTTP Basic Authentication
if ENV['AUTH_BASIC_ON'] == 'true'
  config.middleware.insert_before(ActionDispatch::Static, 'Rack::Auth::Basic', 'Staging') do |username, password|
    [username, password] == [ENV.fetch('AUTH_BASIC_USERNAME'), ENV.fetch('AUTH_BASIC_PASSWORD')]
  end
end

config.middleware.insert_before的第三个参数('Staging')是什么?这个特定参数有什么含义?如果我想在production中运行此代码(通过将其复制/粘贴到config/environments/production.rb),我应该将此参数更改为'Production'吗?如果我将其更改为'Fubar'怎么办?

我尝试在docssource code中查找,但这是无法解释的。另外,我发现它mentioned in a book,但解释充其量也很弱:

args参数是要传递给Rack过滤器的初始化方法的属性的可选散列。

2 个答案:

答案 0 :(得分:2)

这只是Rack::Auth::Basic中间件发送给浏览器的消息;看下面的截图:)

enter image description here

答案 1 :(得分:0)

关于args的更多一般细节:

正如文档中所述,它们是一个传递给中间件或过滤器的初始化器的数组,但是是否应该存在任何args及其含义取决于被调用的代码。

一个简单的人为例子是用于调试Rails应用程序的中间件:

class MiddlewareDebugger
  def initialize(app, *args)
    @app = app
    @args = args
  end

  def call(env)
    Rails.logger.debug "MiddlewareDebugger #{@args.first}"
    status, headers, body = @app.call(env)
    [status, headers, body]
  end
end

并在config / application.rb中我可以添加

config.middleware.insert_before Rack::Head, "MiddlewareDebugger", "1"
config.middleware.insert_before Rack::ConditionalGet, "MiddlewareDebugger", "2"

在Rack :: ConditionalGet

之前,它会在Rack :: Head和MiddlewareDebugger 1之前记录字符串MiddlewareDebugger 2