【问题标题】:How do I disable middleware in Sinatra?如何在 Sinatra 中禁用中间件?
【发布时间】:2014-11-14 10:51:18
【问题描述】:

我正在使用 Sinatra 制作安全的 Web 服务。它需要 SSL 和随每个请求一起发送的安全令牌。因此,我制作了一个简单的中间件,用于检查每个传入请求的安全令牌,如果该请求丢失或无效,则拒绝该请求。

module MyWebService
  class App < Sinatra::Base
    use MyWebService::Security

    # ...
  end
end

但是,这显然使我的大型验证测试套件失败了,因为它们是在我为 Web 服务添加安全性之前编写的。

有没有办法在启用中间件后简单地禁用中间件?这样我的整个测试套件仍然可以运行,并且我可以单独测试安全中间件。

【问题讨论】:

    标签: ruby sinatra rack rack-middleware


    【解决方案1】:

    我找到了一个有用但不美观的解决方法。

    我没有在我的应用程序中启用中间件,而是在config.ru 中启用它。所以:

    module MyWebService
      class App < Sinatra::Base
        use MyWebService::Security   # Remove this line
      end
    end
    

    config.ru:

    require "my_web_service"
    
    app = MyWebService::App
    app.use MyWebService::Security
    
    run app
    

    现在我的所有验证测试都通过了,并且在我启动服务器时启用了安全中间件。

    为了测试安全中间件,我将我的应用子类化并在子类中启用安全中间件:

    class SecurityMiddlewareValidation < Minitest::Test
      include Rack::Test::Methods
    
      def app
        Class.new(MyWebService::App) { use MyWebService::Security }
      end
    
      # ...
    end
    

    这样我就不需要在测试之间禁用/启用中间件。

    【讨论】:

    • 类似的方法是有条件地添加中间件,例如use MyWebService::Security unless $testing。这将使您可以控制在堆栈中添加中间件的位置,但代价是必须在各种测试中处理标志。
    • @matt 是的,但是如果没有办法禁用中间件,它将被永久启用或禁用。这可能是测试时的问题。例如,我的大部分测试必须在禁用安全的情况下运行,但安全测试必须在启用安全的情况下运行。
    • 坦率地说,我认为这是完美的解决方案。中间件是通过config.ru添加的。
    猜你喜欢
    • 2021-09-10
    • 2021-10-27
    • 2012-02-25
    • 2012-09-13
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2012-11-09
    相关资源
    最近更新 更多