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,
];
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,
];