Ограничение скорости для контроллеров рельсов - PullRequest
7 голосов
/ 06 марта 2012

Я ищу движок ограничения скорости для моего приложения rails 3. Я нашел некоторые, но это не то, что мне нужно. Я нашел драгоценный камень с дроссельной заслонкой и драгоценный камень с завитками. Кажется, что стоечный дроссель работает для каждого запроса к приложению rails, но мне нужно ограничить запросы только одним действием. Последний раз Curbit обновлялся два года назад. Может кто-нибудь сказать мне о каких-либо других ограничивающих скорость движках, которые я могу использовать? Обратите внимание, что он должен работать с кэшированием.

Ответы [ 2 ]

13 голосов
/ 06 марта 2012

Ну, наконец, дроссельная заслонка - хорошее решение.

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

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:

Вы можете попробовать другое решение: Атака стойки

2 голосов
/ 06 марта 2012

rack-throttle делает то, что вы хотите.Подкласс Limiter и определите свой собственный метод #allowed?.Просто верните true, если запрос не является действием, которое вы хотите ограничить, и не считайте его до предела.Посмотрите на daily.rb.Переопределите #cache_set, чтобы не сохранять те, которые не соответствуют маршруту, который вы хотите ограничить.

...