2012-10-01 10 views

答えて

15

レート制限のためにRack::Throttleでうまくいっています。内蔵のスロットルクラスをサブクラス化し、allowed?メソッドをオーバーロードします。カスタムロジックは、どのコントローラがアクセスされているかを確認し、必要に応じてレート制限を適用することができます。

class ApiThrottle < Rack::Throttle::Hourly 
    ## 
    # Returns `false` if the rate limit has been exceeded for the given 
    # `request`, or `true` otherwise. 
    # 
    # Rate limits are only imposed on the "api" controller 
    # 
    # @param [Rack::Request] request 
    # @return [Boolean] 
    def allowed?(request) 
    path_info = (Rails.application.routes.recognize_path request.url rescue {}) || {} 

    # Check if this route should be rate-limited 
    if path_info[:controller] == "api" 
     super 
    else 
     # other routes are not throttled, so we allow them 
     true 
    end 
    end 
end 
5

あなたがする必要があるApiThrottleアップセットアップに、イアンの答えに追加:追加する

# application.rb 
require 'rack/throttle' 
class Application < Rails::Application 
    ... 
    config.require "api_throttle" 
    # max 100 requests per hour per ip 
    config.middleware.use ApiThrottle, :max => 100 
    ... 
end 

# /lib/api_throttle.rb 
# Ian's code here 

一つ重要なことは私のために、path_info[:controller]はないだけ"api"として"api/v1/cities"として来た、ということです。もちろん、それは名前空間の設定によるものです。したがって、スロットラーを設置するときは注意してください。

0

Railsエンジンを使用して、マウントされたルート用のスタックに追加のミドルウェアを追加するルートの独立したセットを作成することもできます。それを行うための任意の簡単な方法があったかどうかを確認するために見ながら

https://stackoverflow.com/a/41515577/79079

を参照してください(残念ながら、私はこの質問を見つけました。私は追加したいすべてのミドルウェア用のカスタムミドルウェアを書くことは、さらにラウンド程度使用するよりも思えますa Rails :: Engine)