Ну, наконец, дроссельная заслонка - хорошее решение.
Вы можете сделать это следующим образом. Вы должны определить свой пользовательский лимитер. Он может быть основан на любом из следующих ограничителей
Rack::Throttle::Limiter
Rack::Throttle::Interval
Rack::Throttle::Hourly
Rack::Throttle::Daily
Все, что вам нужно сделать, это наследовать от одного из вышеперечисленных классов для определения пользовательской логики. Например:
class CustomLimiter < Rack::Throttle::Interval
def allowed?(request)
#custom logic here
end
end
Вы должны поместить этот файл в путь RAILS_ROOT/lib
. Затем в файле application.rb
вы должны указать, какой класс использовать в качестве ограничителя. Например, если вы хотите применить ограничитель только к одному действию, вы можете сделать это следующим образом:
#lib/custom_limiter.rb
class CustomLimiter < Rack::Throttle::Interval
def allowed?(request)
path_info = Rails.application.routes.recognize_path request.url rescue {}
if path_info[:controller] == "application" and path_info[:action] == "check_answer"
super
else
true
end
end
end
#config/application.rb
class Application < Rails::Application
...
#Set up rate limiting
config.require "custom_limiter"
config.middleware.use CustomLimiter, :min => 0.2
...
end
Возможно, вам придется принять во внимание это
Надеюсь, это будет полезно
UPD:
Вы можете попробовать другое решение: Атака стойки