Laravel API исключает 1 IP-адрес из ограничения скорости - PullRequest
1 голос
/ 17 июня 2020

В API Laravel я установил ограничения скорости, используя промежуточное ПО по умолчанию для регулирования;

Route::group(['prefix' => 'products'], function() {
    Route::get('/', ['as' => 'products.index', 'uses' => 'CustomerProductController@index'])->middleware('throttle:60,1');
    Route::get('/{product}', ['as' => 'products.show', 'uses' => 'CustomerProductController@show'])->middleware('throttle:50,1');
});

Теперь мне нужно создать собственное промежуточное ПО, чтобы исключить 1 IP-адрес из дросселирования. Но почему-то я могу найти только предложения о том, чтобы делать что-то наоборот, например. регулирование группы IP-адресов.

Может ли кто-нибудь подтолкнуть меня в правильном направлении?

1 Ответ

2 голосов
/ 17 июня 2020

Вот краткий обзор того, что я бы сделал.

Шаг 1

Создайте новое промежуточное ПО, т.е. ThrottleRequestsWithIp

php artisan make:middleware ThrottleRequestsWithIp

Шаг 2

Пусть он расширяет исходный класс промежуточного программного обеспечения дроссельной заслонки \Illuminate\Routing\Middleware\ThrottleRequests.

Если вы хотите взглянуть на исходное промежуточное ПО фреймворка, вы можете найти его в разделе /vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php

Перезаписать метод handle, чтобы проверить IP-адрес и вызвать родительский метод, если он не найден.

Вот как ваш App\Http\Middleware\ThrottleRequestsWithIp может выглядеть

<?php

namespace App\Http\Middleware;

use Closure;

class ThrottleRequestsWithIp extends \Illuminate\Routing\Middleware\ThrottleRequests
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 1, $prefix = '')
    {
        if($request->ip() === "192.168.10.2") 
            return $next($request);

        return parent::handle($request, $next, $maxAttempts, $decayMinutes, $prefix);
    }
}

Шаг 3

Зарегистрируйте новое промежуточное ПО в ядре. php, например

'throttleIp' => \App\Http\Middleware\ThrottleRequestsWithIp::class

Шаг 4

Используйте его в своих маршрутах следующим образом

Route::get('/', [
    'as' => 'products.index', 
    'uses' => 'CustomerProductController@index'
])->middleware('throttleIp:60,1');
...