«Ограничитель скорости» контролирует, как часто может происходить какое-либо событие (например, HTTP-запрос или попытка входа в систему). Ограничение скорости обычно используется в качестве защитной меры для защиты услуг от чрезмерного использования.
Symfony 5.2 представляет новый компонент RateLimiter, так что вы можете добавлять эти средства защиты в свои собственные приложения. Например, представьте, что вы хотите применить те же ограничения, что и GitHub, к вашим собственным API-интерфейсам при анонимном использовании: 60 запросов в час и идентификация запросов по исходному IP-адресу.
Сначала настройте новый ограничитель скорости следующим образом:
# config/packages/rate_limiter.yaml
framework:
rate_limiter:
anonymous_api:
strategy: fixed_window
limit: 60
interval: '60 minutes'
Теперь вставьте ограничитель скорости в свои контроллеры или службы и используйте его, чтобы проверить, следует ли разрешить запрос или нет:
// src/Controller/ApiController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
use Symfony\Component\RateLimiter\Limiter;
class ApiController extends AbstractController
{
// the variable name must be: "rate limiter name" + "limiter" suffix
public function index(Limiter $anonymousApiLimiter)
{
// create a limiter based on the client's IP address
// (you can also use a username/email, an API key, etc.)
$limiter = $anonymousApiLimiter->create($request->getClientIp());
// try to consume a resource; if it's accepted, serve the request
// otherwise, return a 429 (Too Many Requests) error
if (false === $anonymousApiLimiter->consume()->isAccepted()) {
throw new TooManyRequestsHttpException();
}
// ...
}
// ...
}
Это оно! Компонент RateLimiter реализует множество других функций и предоставляет две разные стратегии для управления пределами: «фиксированное окно» и «сегмент токена». Прочтите документацию по RateLimiter, чтобы узнать все о его функциях.