RateLimiter в Laravel 8 | OTUS
Запланируйте обучение с выгодой в Otus!
-15% на все курсы до 30.11 Забрать скидку! →
Выбрать курс

RateLimiter в Laravel 8

RateLimiter делает управление скоростью обработки запросов более простым, масштабируемым и удобным в применении. Подумайте об этом, если планируете перейти на Laravel 8.

В прошлых версиях Laravel, включая седьмую, при необходимости ограничения скорости обработки запросов на определённых маршрутах, пользователь мог реализовать это с помощью throttle:

Screenshot_1-1801-c419ea.png

В данной конфигурации параметр 30,1 означает, что аутентифицированный юзер может получать доступ к маршруту тридцать раз в минуту, а если он превысит данный лимит, фреймворк Laravel вернет ошибку 429 Too Many Requests.

Однако числа захардкожены и нет возможности настроить их динамическое изменение либо переиспользование этой настроенной конфигурации для иных маршрутов. Сегодня данную проблему можно решить в Laravel 8, что достигается с помощью фасада RateLimiter.

Фасад RateLimiter

Используя фасад Illuminate\Support\Facades\RateLimiter, вы получите возможность задать «именованные» ограничители скорости разных конфигураций. Так как у них теперь существуют имена, в свою очередь, появляется возможность применять их для различных маршрутов и групп этих маршрутов.

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

Ограничители прописывают в методе boot в AppServiceProvider. К примеру, если нужен ограничитель limitadmin, можно поступить следующим образом:

Screenshot_2-1801-fc7a94.png

В данном случае метод for в RateLimiter принимает 2 параметра: • название ограничителя скорости; • замыкание, возвращающее конфигурацию ограничения для маршрутов.

В замыкании можно вернуть фактическое ограничение скорости запросов, применяя метод perMinute из Illuminate\Cache\RateLimiting\Limit, где вы указываете, сколько раз в минуту юзеру разрешён доступ к маршруту.

Применяем именованный ограничитель скорости

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

Screenshot_3-1801-d18f3d.png

Как можно видеть, вместо закардкоженной конфигурации, вы просто задействуете имя ограничителя. В результате получаем читабельное и доступное для многократного применения решение.

Динамические ограничители

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

К примеру, замыкание метода for получает объект Illuminate\Http\Request, поэтому мы можем его использовать. Допустим, надо ограничивать лишь обычных пользователей, но не администраторов. Реализовать это можно следующим образом:

Screenshot_4-1801-92239c.png

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

Кастомный ответ

Вдобавок ко всему, вместо стандартного 429 Too Many Requests мы можем вернуть свой собственный ответ, для чего пригодится метод response:

Screenshot_5-1801-e51921.png

Вот так вот. Пожалуй, теперь вы не будете спорить с тем, что RateLimiter делает управление скоростью обработки запросов более простым, масштабируемым и удобным в применении.

По материалам статьи «New RateLimiter facade for defining named rate limiters in Laravel 8».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто
Черная пятница в Otus! ⚡️
Скидка 15% на все курсы до 30.11 →