Laravel:在触发限流锁定前显示警告的实现问题
解决方案
你之前的代码无法生效,核心问题在于未关联自定义限流规则以及逻辑顺序错误,以下是修正后的实现方案:
问题分析
- 你直接调用
RateLimiter::remaining()时,没有关联到你定义的example限流规则,导致计数逻辑和你预设的5次/小时规则脱节; - 逻辑顺序错误:应该先触发失败计数(
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' ]);
补充说明
- 确保路由已应用限流:你的登录路由必须添加
throttle:example中间件,否则限流规则不会生效,示例:Route::post('/login', [LoginController::class, 'store'])->middleware('throttle:example'); - 优化用户独立计数:如果不想让同IP下的不同用户互相影响限流计数,可以修改
RouteServiceProvider中的by()参数为用户邮箱(假设登录时传了邮箱参数):return Limit::perHour(5)->by($request->input('email') ?: $request->ip())->response(...);
内容的提问来源于stack exchange,提问作者BigJobbies
相关产品推荐
相关产品推荐

