2012-03-06 2 views
7

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

+0

как насчет дросселирования на веб-сервере (apache?) – Roger

+0

@Rogier проект будет развернут на heroku – RomanKapitonov

ответ

13

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

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

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 

Вы, возможно, потребуется принять this во внимание

Надежда это будет полезно

UPD :

вы можете проверить еще одно решение: rack-attack

+0

неправильный код! измените на config.require "custom_failure" CelinHC

+0

исправлено все, кажется, сейчас – RomanKapitonov

+0

Спасибо за пошаговое руководство. Просто узнайте немного о настройке. Используете ли вы, какую БД хранить счетчики? – Eduardo

2

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

+0

Я переопределил его и поместил файл в каталог lib и перезапустил сервер, но он не работает. 'class CustomLimiter 0.2'. Что случилось? – RomanKapitonov

Смежные вопросы