Laravel-пакет, реализующий методы ограничения HTTP-запросов
Данный пакет включает в себя 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.