Ruby on rails - 机架中间件排除 - 是否可能?

Sai*_*ish 2 ruby rack middleware ruby-on-rails ruby-on-rails-3

我正在尝试机架中间件,在单独的层中进行身份验证.问题是,所有请求都通过这一层.我不希望像css,javascript这样的资产请求通过身份验证中间件.我也不希望注销流程通过这个.

在application.rb中

config.middleware.use AuthClient::MyFilterClass
Run Code Online (Sandbox Code Playgroud)

我期待着类似的东西

config.middleware.use AuthClient::MyFilterClass, :exclude => [:logout,'*/assets/*']
Run Code Online (Sandbox Code Playgroud)

有没有办法从中间件中排除自定义路径/操作?

Dam*_*IEU 9

机架中间件形成一个向上和向下堆栈,如下例所示:

机架中间件

这意味着无论您提出何种要求,无论如何都会通过所有中间件.
所以你不能排除这样的中间件.

但你可以做的是将自己的中间件注入堆栈,这将检查请求路径并调用其他一些中间件.

像这样的东西:

class MyMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['REQUEST_PATH'].match(/^\/assets\//)
      middleware = AuthClient::MyFilterClass.new(@app)
      env = middleware.call(env)
    end

    @app.call(env)
  end
end
Run Code Online (Sandbox Code Playgroud)

这将AuthClient::MyFilterClass根据请求路径调用中间件.