Laravel中throttle搭配auth:sanctum时未认证用户限流不生效如何解决
问题原因分析
- 中间件执行顺序错误:你最初的配置把
auth:sanctum放在throttle前面,未认证用户的请求会直接被身份校验中间件拦截返回401,完全不会触发后面的限流逻辑,这是最核心的原因。 - 限流参数写法有误:你用的
throttle:5|60,1写法不符合Laravel默认throttle中间件的参数规则,参数解析失败会导致限流规则不生效。
正确配置方案
方案1:直接调整路由顺序+修正参数(简单场景)
如果你只需要对所有访问该路由的请求统一限制每分钟5次,不管是否认证,直接调整中间件顺序,修正参数即可:
// throttle放在auth前面,参数为 最大请求数,时间周期(单位分钟) Route::middleware(['throttle:5,1', 'auth:sanctum'])->group(function () { Route::apiResource('company.vehicles', VehicleController::class); });
方案2:区分认证/未认证用户的限流规则(推荐)
如果需要给认证用户更高的限流阈值,未认证用户保持每分钟5次的限制,可以先自定义限流规则:
- 打开
app/Providers/RouteServiceProvider.php,在configureRateLimiting方法中添加自定义限流器:
use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Http\Request; protected function configureRateLimiting() { // 原有其他限流规则保留 RateLimiter::for('vehicle_api', function (Request $request) { // 认证用户按用户ID限流,每分钟60次;未认证用户按IP限流,每分钟5次 return $request->user() ? Limit::perMinute(60)->by($request->user()->id) : Limit::perMinute(5)->by($request->ip()); }); }
- 路由中直接引用自定义限流器:
Route::middleware(['throttle:vehicle_api'])->group(function () { Route::middleware(['auth:sanctum'])->group(function () { Route::apiResource('company.vehicles', VehicleController::class); }); });
校验方法
不带身份认证令牌重复请求接口,第6次请求时应该返回429 Too Many Requests状态码,代表限流生效。
内容的提问来源于stack exchange,提问作者Yiannis Mpourkelis
相关产品推荐
相关产品推荐

