0

Rack :: Throttleについて読んでいて、デフォルトのクライアント識別子をIPから別のIPに変更したいと思います。ドキュメントにはそれができると書かれています

Rack :: Throttleによって保存および維持されるレート制限カウンターは、一意のHTTPクライアントに合わせて調整されます。

デフォルトでは、HTTPクライアントは、Rack :: Request#ipによって返される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
4

1 に答える 1

1

既存のラックスロットルクラスの1つ(おそらく、またはのいずれRack::Throttle::IntervalRack::Throttle::TimeWindow、ニーズに近い方)をサブクラス化し、メソッドをオーバーライドする必要があります#client_identifier

#client_identifier1つの引数が渡されますrequest。これは着信HTTPリクエストで渡された情報を含むRack::Requestインスタンスであり、HTTPヘッダー、Cookie、パス、およびアプリに応じてその他の情報などの情報を取得するために使用できます。デフォルトの実装は次のようになります。

# @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

これuseは、Rackアプリケーションで次のように使用できます。

use UserThrottle, :min => 100

既存のスロットルクラスをサブクラス化するだけな:minので、Rackステートメントのようなオプションを渡すことができることに注意してください。そして、これをRailsアプリに採用するには、ファイルuseを呼び出すだけです( Rails on Rackを参照)。useapplication.rb

于 2013-03-05T07:19:29.617 に答える