跳至内容 跳至搜索
方法
R

实例公有方法

rate_limit(to:, within:, by: -> { request.remote_ip }

对所有操作或由正常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
# 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