特定のRailsルートでのみRackミドルウェアをトリガーすることは可能ですか?特定のRailsルートのトリガーラックミドルウェア
たとえば、レートリミッタミドルウェアをapi名前空間でのみ実行するとします。
namespace :api do
resources :users
end
特定のRailsルートでのみRackミドルウェアをトリガーすることは可能ですか?特定のRailsルートのトリガーラックミドルウェア
たとえば、レートリミッタミドルウェアをapi名前空間でのみ実行するとします。
namespace :api do
resources :users
end
レート制限のために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
あなたがする必要がある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"
として来た、ということです。もちろん、それは名前空間の設定によるものです。したがって、スロットラーを設置するときは注意してください。
Railsエンジンを使用して、マウントされたルート用のスタックに追加のミドルウェアを追加するルートの独立したセットを作成することもできます。それを行うための任意の簡単な方法があったかどうかを確認するために見ながら
https://stackoverflow.com/a/41515577/79079
を参照してください(残念ながら、私はこの質問を見つけました。私は追加したいすべてのミドルウェア用のカスタムミドルウェアを書くことは、さらにラウンド程度使用するよりも思えますa Rails :: Engine)