Lumen использует дроссель для ограничения частоты доступа к интерфейсу

PHP

предисловие

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

существуетLaravel 5.2Добавлена ​​новая функцияthrottleПромежуточное программное обеспечение, с помощью которого можно установить ограничения на уровне маршрутизации.APIчастота посещения. Например, предел частоты составляет 50 раз в минуту, если этот предел будет превышен в течение одной минуты, он ответит: 429: Too Many Attempts.

Но то, что я использую в своем проекте,Lumenрама (есть толькоLaravelЧасть функции в ), она не интегрирует это промежуточное программное обеспечение, поэтому в этой статье в основном описывается, какLumenдобавлен в рамкуthrottleпромежуточное ПО.

Начинать

Сначала мы должныapp\Http\MiddlewareЧжунсинThrottleRequests.phpдокумент.

И скопируйте код из следующей ссылки в этот файл:

GitHub.com/illuminate/…

Затем измените пространство имен в файле:

namespace App\Http\Middleware;

Отметить тот же запрос клиента

потому чтоLumenВ фреймворке отсутствуют некоторые функции, нам нужно изменитьThrottleRequests.phpсерединаresolveRequestSignatureметод:

protected function resolveRequestSignature($request){
    return sha1(
        $request->method() .
        '|' . $request->server('SERVER_NAME') .
        '|' . $request->path() .
        '|' . $request->ip()
    );
}

бросить ответ

throttleТо, что выбрасывается при превышении лимита,Illuminate\Http\Exceptions\ThrottleRequestsException,такой жеLumenВо фреймворке отсутствует этот файл, вам нужно определить его самостоятельно, вapp/ExceptionsЧжунсинThrottleException.php, напишите следующий код:

<?php

namespace App\Exceptions;

use Exception;

class ThrottleException extends Exception{
    protected $isReport = false;

    public function isReport(){
        return $this->isReport;
    }
}

существуетapp/Exceptions/Handler.phpПерехватите выброшенное исключение вrenderМетод добавляет следующие суждения:

if ($exception instanceof ThrottleException) {
	return response([
        'code' => $exception->getCode(),
        'msg' => $exception->getMessage()
	], 429);
}

ИсправлятьThrottleRequests.phpв файлеbuildExceptionметод:

protected function buildException($key, $maxAttempts){
	$retryAfter = $this->getTimeUntilNextRetry($key);
	$headers = $this->getHeaders(
        $maxAttempts,
        $this->calculateRemainingAttempts($key, $maxAttempts, $retryAfter),
        $retryAfter
    );
    // 修改了这一行
  	return new ThrottleException('Too Many Attempts.', 429);
}

Эту строку нужно добавить в заголовок файла:use App\Exceptions\ThrottleException;

зарегистрировать промежуточное ПО

существуетbootstrap/app.phpЗарегистрируйтесь в:

$app->routeMiddleware([
     'throttle' => App\Http\Middleware\ThrottleRequests::class,
]);

На данный момент мы успешно добавили, а затем можем добавить промежуточное ПО к маршрутизации:

 $router->group(['middleware' => ['throttle:10,2']],function() use ($router){

	$router->post('feedback','UserController@addFeedback');

});

вthrottle:10,2Указывает на 10 посещений за 2 минуты.

Примечание: Данная статья является оригинальной статьей, если вам необходимо перепечатать, пожалуйста, укажите источник.