You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel:在触发限流锁定前显示警告的实现问题

解决方案

你之前的代码无法生效,核心问题在于未关联自定义限流规则以及逻辑顺序错误,以下是修正后的实现方案:

问题分析

  1. 你直接调用RateLimiter::remaining()时,没有关联到你定义的example限流规则,导致计数逻辑和你预设的5次/小时规则脱节;
  2. 逻辑顺序错误:应该先触发失败计数(hit),再检查已尝试次数,而非先判断剩余次数再计数。

修正后的代码实现

在登录控制器的登录处理方法中,找到登录验证失败的分支(比如密码不匹配的逻辑),替换为以下代码:

use Illuminate\Support\Facades\RateLimiter;

// 获取你定义的「example」限流实例
$limiter = RateLimiter::for('example', $request);
// 触发一次失败登录计数
$limiter->hit();

// 获取当前已尝试的失败次数
$attempts = RateLimiter::attempts($limiter->key());

$errorMessage = '';

// 当累计失败2次时,显示警告提示
if ($attempts === 2) {
    $errorMessage = 'You have had two failed login attempts. If you continue entering an incorrect password your account will be locked.';
}

// 返回登录视图,携带错误提示
return view('auth.login', [
    'error' => $errorMessage,
    'page' => 'login'
]);

补充说明

  1. 确保路由已应用限流:你的登录路由必须添加throttle:example中间件,否则限流规则不会生效,示例:
    Route::post('/login', [LoginController::class, 'store'])->middleware('throttle:example');
    
  2. 优化用户独立计数:如果不想让同IP下的不同用户互相影响限流计数,可以修改RouteServiceProvider中的by()参数为用户邮箱(假设登录时传了邮箱参数):
    return Limit::perHour(5)->by($request->input('email') ?: $request->ip())->response(...);
    

内容的提问来源于stack exchange,提问作者BigJobbies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:01:25