【问题标题】:Subclass Rack::Throttle子类机架::油门
【发布时间】:2013-03-03 00:39:29
【问题描述】:

我正在阅读有关 Rack::Throttle 的信息,我想将默认客户端标识符从 IP 更改为其他内容。文档说可以做到

Rack::Throttle 存储和维护的限速计数器是 键控到唯一的 HTTP 客户端。

默认情况下,HTTP 客户端由其 IP 地址唯一标识 由 Rack::Request#ip 返回。如果您希望改为使用更多 细粒度的、特定于应用程序的标识符,例如会话密钥或 用户帐户名,您只需要子类化一个限制策略 实现并覆盖#client_identifier 方法。

我不知道在哪里添加它,这是我当前的另一个方法的子类。有人知道怎么做这个吗? https://github.com/datagraph/rack-throttle

    module Rack
  module Throttle
    class DailyRequests < Daily
      def allowed?(request)
        ## Insert rules
        super request
      end
    end

    class HourlyRequests < Hourly
      def allowed?(request)
        ## Insert rules
        super request
      end
    end

    class RequestInterval < Interval
      def allowed?(request)
        ## Insert rules
        super request
      end
    end
  end
end

【问题讨论】:

标签: ruby heroku rubygems rack throttling


【解决方案1】:

您应该继承现有的rack-throttle 类之一(可能是Rack::Throttle::Interval 或Rack::Throttle::TimeWindow,以更符合您需求的为准)并覆盖#client_identifier 方法。

#client_identifier 被传递一个参数,request,这是一个 Rack::Request 实例,包含传入的 HTTP 请求中传递的信息,可用于获取 HTTP 标头、cookie、路径和可能的其他信息等信息取决于您的应用程序。默认实现看起来like this:

# @param  [Rack::Request] request
# @return [String]
def client_identifier(request)
  request.ip.to_s
end

这是一个子类化 Rack::Throttle::Interval 以匹配查询参数(例如 ?user_id=&lt;id&gt;)上的请求的示例:

class UserThrottle < Rack::Throttle::Interval
  def client_identifier(request)
    request['user_id']
  end
end

您可以在 Rack 应用程序中使用use:

use UserThrottle, :min => 100

请注意,您仍然可以将 :min 之类的选项传递给 Rack use 语句,因为它只是现有油门类的子类。而在 Rails 应用程序中采用这一点只需要在您的application.rb 文件中调用use(请参阅Rails on Rack)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多