Spec-Zone.ru › Ruby on Rails 8.0

модуль ActionController::RateLimiting::ClassMethods

Публичные методы экземпляров

rate_limit(to:, within:, by: -> { request.remote_ip } Показать исходный код
# File actionpack/lib/action_controller/metal/rate_limiting.rb, line 55
def rate_limit(to:, within:, by: -> { request.remote_ip }, with: -> { head :too_many_requests }, store: cache_store, name: nil, **options)
  before_action -> { rate_limiting(to: to, within: within, by: by, with: with, store: store, name: name) }, **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.

Если вы хотите использовать несколько ограничений скорости на один контроллер, вам необходимо присвоить каждому из них явное имя через опцию name:.

Примеры:

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

class SessionsController < ApplicationController
  rate_limit to: 3, within: 2.seconds, name: "short-term"
  rate_limit to: 10, within: 5.minutes, name: "long-term"
end

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API