Rails передает контроллер данных в файл инициализаторов - PullRequest
0 голосов
/ 26 мая 2020

Я хотел бы настроить ограничение и период, когда пользователь передает информацию в запросе api.

config/initializers/rack_attack.rb

Rack::Attack
  Rack::Attack.cache.store = ActiveSupport::Cache::MemoryStore.new 

  Rack::Attack.throttle('request per ip for campaigns', :limit => 6, :period => 60.seconds) do |req|
    req.api if req.path == '/api' && req.get?
  end

end

У меня есть контроллер, который извлекает параметры

rate_limit_controller.rb

class RateLimitController < BaseController
  # GET /api/limit= &period=
  #
  def index
    @testlimit = params[:limit]
    @testperiod = params[:period]
    render json:@testlimit
  end
end

можно ли передать информацию с контроллера на rack_attack?

1 Ответ

0 голосов
/ 18 июня 2020

Да, можно передать параметры в rack_attack

Вы можете:

class Rack::Attack
    Rack::Attack.cache.store = ActiveSupport::Cache::MemoryStore.new 
    limit_proc = proc { |req| (req.params["limit"] && req.params["limit"].to_i) || 1 } # default to 1
    period_proc = proc { |req| (req.params["period"] && req.params["period"].to_i) || 5 } # default to 5

    Rack::Attack.throttle('request per ip for campaigns', :limit => limit_proc, :period => period_proc) do |req|
        req.ip if req.path == '/' && req.get?
    end

end

Но вам следует избегать этого, потому что его довольно легко взломать, любой может отправить лимит и параметры периода и изменить регулирование.

Если вы хотите настроить лимит и период на основе пользователя, вы должны сохранить сопоставление пользователя с лимитом и периодом в redis.

Затем в limit_pro c & period_pro c загружает значения лимита и периода из redis.

...