Laravel 5:如何重置内置Throttle/RateLimiter?
解决Laravel登录成功后重置Throttle限流计数的问题
我之前也碰到过类似的需求,刚好可以给你梳理两种可行的方案:
方案一:自定义限流Key(最简单省心)
如果你能调整中间件配置,这是最直接的办法。在Kernel.php的api中间件组里,给throttle加上第三个参数作为专属自定义Key,比如给登录接口的限流指定一个标识:
protected $middlewareGroups = [ 'api' => [ // 新增第三个参数作为自定义限流Key 'throttle:10,3,login_throttle' ] ];
这样登录接口的限流计数就会绑定到login_throttle这个Key上。之后在登录成功的逻辑里(比如LoginController的authenticated方法,或者你自定义的登录处理函数),直接调用RateLimiter的clear方法就能清除计数:
use Illuminate\Support\Facades\RateLimiter; // 登录成功后执行此代码 RateLimiter::clear('login_throttle');
这种方式不用纠结中间件生成的复杂Key,简单粗暴还不容易出错。
方案二:复用默认限流Key生成逻辑(无需修改现有配置)
如果不想改动当前的中间件配置,那我们需要复刻ThrottleRequests中间件生成Key的逻辑,生成和它完全一致的Key再清除计数。
Laravel的ThrottleRequests中间件生成Key的逻辑是:先根据请求IP(未认证用户)或用户ID(已认证用户)生成签名,再拼接上限流的最大尝试次数(也就是你配置的10)。
在登录成功的代码里可以这么实现:
use Illuminate\Support\Facades\RateLimiter; use Illuminate\Routing\Middleware\ThrottleRequests; // 获取当前请求实例 $request = request(); // 实例化ThrottleRequests中间件 $throttleMiddleware = app(ThrottleRequests::class); // 生成和中间件一致的请求签名 $signature = $throttleMiddleware->throttleKey($request); // 拼接限流最大尝试次数,生成完整的限流Key $throttleKey = $signature . '|10'; // 清除该Key对应的限流计数 RateLimiter::clear($throttleKey);
这里直接复用了中间件的throttleKey方法,确保生成的Key和限流中间件使用的完全一致,避免自己写逻辑出现偏差。
需要注意:登录动作执行时用户还未完成认证,所以限流签名是基于请求IP生成的,我们清除的也是这个IP对应的限流计数,刚好符合需求。
内容的提问来源于stack exchange,提问作者Raheel Hasan
相关产品推荐
相关产品推荐

