Subclass Rack :: Throttle

时间:2013-03-03 00:39:30

标签: ruby heroku rubygems rack throttling

我正在阅读关于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

1 个答案:

答案 0 :(得分:1)

您应该对现有的rack-throttle类之一进行子类化(可能是Rack::Throttle::IntervalRack::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=<id>)的请求的示例:

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

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

use UserThrottle, :min => 100

请注意,您仍然可以将:min之类的选项传递给Rack use语句,因为它只是对现有的限制类进行子类化。在Rails应用程序中采用此方法只需在use文件中调用application.rb(请参阅Rails on Rack)。