Laravel。如何在超过节流限制后暂停更长时间的用户请求?

Laravel. How to suspend user requests for a longer time after throttling limit is exceeded?

Laravel 具有控制请求节流的本机能力。示例是中间件 throttle:60,1,这意味着每分钟 60 个请求到特定路由。但是,如果超过该限制,是否可以暂停请求?

我需要什么? 我有 2 条路线:
/lock ==> 这会使用会话标识符
更新记录 /unlock ==> 如果发送了正确的密码,这应该会解锁,但是如果它每分钟有 5 次尝试使用无效密码 (throttle:5,1),那么它应该暂停 30 分钟,并且每个请求都应该拒绝

这里我们有动态节流。我可以使用本机 laravel 功能实现它吗?

您可以通过扩展原始的 ThrottleRequests 中间件来完成您想要的任何逻辑:

<?php

namespace App\Http\Middleware;

use Closure;

class ThrottleRequests extends \Illuminate\Routing\Middleware\ThrottleRequests
{
    public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 2)
    {
        $original = parent::handle($request, $next, $maxAttempts, $decayMinutes);

        if ($this->limiter->tooManyAttempts($key, $maxAttempts, $decayMinutes)) {
            // Do whatever you need to...
        }

        return $next($request);
    }
}

然后编辑您的 App\Http\Kernel.php 以使用您的自定义 ThrottleRequests 中间件:

protected $routeMiddleware = [
   'throttle' => \App\Http\Middleware\ThrottleRequests::class,
];