модуль ActionController::RateLimiting::ClassMethods
Общедоступные методы экземпляров
# File actionpack/lib/action_controller/metal/rate_limiting.rb, line 47
def rate_limit(to:, within:, by: -> { request.remote_ip }, with: -> { head :too_many_requests }, store: cache_store, **options)
before_action -> { rate_limiting(to: to, within: within, by: by, with: with, store: store) }, **options
end Применяет лимит скорости к всем действиям или тем, которые указаны стандартными фильтрами before_action с only: и except:.
Максимальное количество разрешенных запросов задается to: и ограничено временным интервалом, заданным within:.
По умолчанию лимиты скорости уникальны для IP-адреса, производящего запрос, но вы можете задать свою функцию идентификации, передав вызываемую функцию в параметре by:. Она вычисляется в контексте обработки запроса контроллером.
Запросы, превышающие лимит скорости, отклоняются с ответом 429 Too Many Requests. Вы можете настроить это, передав вызываемую функцию в параметре with:. Она вычисляется в контексте обработки запроса контроллером.
Лимитирование скорости зависит от хранилища ActiveSupport::Cache и по умолчанию использует config.action_controller.cache_store, которое само по умолчанию использует глобальное config.cache_store. Если вы не хотите хранить лимиты скорости в том же хранилище, что и ваши общие кэши, вы можете передать пользовательское хранилище в параметре store.
Примеры:
class SessionsController < ApplicationController
rate_limit to: 10, within: 3.minutes, only: :create
end
class SignupsController < ApplicationController
rate_limit to: 1000, within: 10.seconds,
by: -> { request.domain }, with: -> { redirect_to busy_controller_url, alert: "Too many signups on domain!" }, only: :new
end
class APIController < ApplicationController
RATE_LIMIT_STORE = ActiveSupport::Cache::RedisCacheStore.new(url: ENV["REDIS_URL"])
rate_limit to: 10, within: 3.minutes, store: RATE_LIMIT_STORE
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.