avto-dev/requests-limiter-laravel

Laravel package for requests limitation


Keywords
package, middleware, laravel, limits, limiter, requests
License
MIT

Documentation

Laravel

Laravel-пакет, реализующий методы ограничения HTTP-запросов

Version Build StyleCI Coverage Code Quality License Issues Downloads

Данный пакет включает в себя middleware для фреймворка Laravel, ограничивающий число запросов по установленным условиям.

Установка

Для установки данного пакета выполните в терминале следующую команду:

$ composer require avto-dev/requests-limiter-laravel "~0.1"

Для этого необходим установленный composer. Для его установки перейдите по данной ссылке.

Для версии Laravel 5.4.* необходимо вручную зарегистрировать сервис провайдер и middleware alias:

Сервис-провайдер в секции providers файла ./config/app.php:

'providers' => [
    // ...
    AvtoDev\RequestsLimiter\RequestsLimiterServiceProvider::class,
]

И middleware alias в файле ./app/Http/Kernel.php:

protected $routeMiddleware = [
    // ...
    'requests_limiter' => \AvtoDev\RequestsLimiter\Middleware\RequestsLimiterMiddleware::class,
]

Опционально можете "опубликовать" файл конфигурации командой:

$ ./artisan vendor:publish --provider="AvtoDev\RequestsLimiter\RequestsLimiterServiceProvider"

Данная команда создаст файл ./config/requests-limiter.php с настройками "по умолчанию", которые вы можете переопределить по своему усмотрению.

Настройки

Настройки хранятся в файле ./config/requests-limiter.php:

Имя параметра Его описание
enabled Middleware включен. Если этот параметр равен false то ограничения не будут срабатывать даже если middleware установлен для роута или группы роутов
default_mode Битовая маска ограничений "по умолчанию". Используется если middleware установлен для роута без параметра битовой маски. В настройках по умолчанию используется сумма всех параметров ограничений;
limits Настройки для различных типов ограничений;
modificators Модификаторы лимитов для различных состояний запроса;
exception_class Класс исключения, "бросаемый" при превышении числа запросов. Вы можете указать своё имя класса исключения;
exception_code HTTP-код бросаемого исключения.

Поддерживаемые типы ограничений

Данный пакет поддерживает следующие типы ограничений:

Тип ограничения Его описание
limits.user_agent Битовая маска 1. В расчёте ограничения используется значение User Agent запроса. Рекомендуется, когда надо ограничить число запросов для отдельного пользователя
limits.ip Битовая маска 2. В расчёте ограничения используется значение User IP. При использовании в отдельности ограничивает число запросов с одного IP
limits.url Битовая маска 4. В расчёте ограничения используется значение URL запроса. Рекомендуется, когда нужно ограничить число одинаковых запросов от пользователя

Маску limits.user_agent рекомендуется использовать в связке с ограничением по IP, иначе будут блокироваться все пользователи с одинаковым значением User Agent

Настройки отдельного ограничения

В данной секции содержатся параметры работы режимов ограничений:

Параметр Его описание
limits.<ТИП_ОГРАНИЧЕНИЯ>.time Период времени в секундах, на который рассчитывается число запросов
limits.<ТИП_ОГРАНИЧЕНИЯ>.count Максимальное число запросов в указанный период времени
limits.<ТИП_ОГРАНИЧЕНИЯ>.mode Код условия ограничения. Является битовой маской ограничения. Допустимы целочисленные значения: 1, степени двойки или их суммы. Желательно, чтобы параметр mode был уникальным для каждого ограничения

Использование битовой маски

Для того, чтобы указать ограничения для middleware, передайте первым параметром значение (битовую маску), которая является суммой значений режимов используемый ограничений.

Пример:

Route::get('/', 'HomeController@index')->middleware(['requests_limiter:7']);

Где 7 является суммой 1+2+4 (limits.user_agent.mode + limits.ip.mode + limits.url.mode)

Использование

Для использования ограничения для роута или группы роутов укажите:

Route::get('/', 'HomeController@index')->middleware(['requests_limiter']);

Если Вы хотите переопределить настройки, то передайте свои параметры:

Пример:

Route::get('/', 'HomeController@index')->middleware(['requests_limiter:3,90,30']);

Где: 3 - битовая маска ограничений, 90 - период в секундах, 30 - максимальное число запросов.

Если для одного роута или группы роутов необходимо использовать различные режимы ограничений с разными правилами, то добавьте данный middleware несколько рах с необходимыми параметрами:

Пример:

Route::get('/', 'HomeController@index')->middleware(['requests_limiter:3', 'requests_limiter:2']);

В данном примере ограничение по максимальному числу запросов будет использоваться для связки User Agent + User IP и отдельно для User IP.

Тестирование

Для тестирования данного пакета используется фреймворк phpunit. Для запуска тестов выполните в терминале:

$ git clone git@github.com:avto-dev/requests-limiter-laravel.git ./requests-limiter-laravel && cd $_
$ composer update --dev
$ composer test

Поддержка и развитие

Если у вас возникли какие-либо проблемы по работе с данным пакетом, пожалуйста, создайте соответствующий issue в данном репозитории.

Если вы решите самостоятельно реализовать дополнительный функционал - создайте PR с соответствующими изменениями. Крайне желательно сопровождать PR соответствующими тестами, фиксирующими работу ваших изменений. После проверки и принятия изменений будет опубликована новая минорная версия.

Лицензирование

Код данного пакета распространяется под лицензией MIT.