我正在尝试使用 api.php 中的基本身份验证在 API 路由上按用户设置速率限制,但似乎身份验证用户信息未传递到
RateLimiter
,因为我收到错误:
“尝试读取 null 属性 ID”。
这是我的代码
configureRateLimit()
:
RouteServiceProvider.php:
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('getRequest', function (Request $request) {
return Limit::perMinute(2)->by($request->user()->id)->response(function(){
return response()->json([
'response' => 'failed',
'message' => 'Too many request has been made',
],429);
});
});
}
api.php 路线:
Route::middleware(['auth.basic.once'])->prefix('v1')->group(function() {
Route::middleware(['throttle:getRequest'])->get('/animals/{id?}', [animalsApiController::class, 'show']);
});
我尝试使用
Auth::user()->id, user()->id()
和 Auth::id()
代替 $request->user()->id
但同样的错误。谁能告诉我我是否做错了什么或者我是否遗漏了什么?
注意:在控制器中检查
$request->user()->id
时,它显示正常。
对于使用 Laravel 8 或更高版本以及使用 sainttum 来生成代币的人。
以下代码将有助于在您想要限制某些用户的情况下实现用户明智的速率限制。
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
$rate_limit = 100;
if(auth()->user()){
$rate_limit = (isset(auth()->user()->rate_limit) ? auth()->user()->rate_limit : $rate_limit);
return Limit::perMinute($rate_limit)->by(auth()->user()->id)->response(function(){
return response()->json([
'response' => 'Failed',
'message' => 'Too many request has been made',
],429);
});
}else{
return Limit::perMinute($rate_limit)->by($request->user()?->id ?: $request->ip())->response(function(){
return response()->json([
'response' => 'Failed',
'message' => 'Too many request has been made',
],429);
});
}
});
}
RouteServiceProvider.php:
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('getRequest', function (Request $request) {
dd(auth()->check());
return Limit::perMinute(2)->by($request->user()->id)->response(function(){
return response()->json([
'response' => 'failed',
'message' => 'Too many request has been made',
],429);
});
});
}
首先检查登录用户
为我不同的 api 请求创建了 2 个油门限制器。
Route::post('route-url1', [NameController::class, 'method_1'])->middleware('throttle:rate_limiter_1');
Route::post('route-url1', [NameController::class, 'method_2'])->middleware( 'throttle:rate_limiter_2');
这是我的油门限制器。
$rateLimiterHandler = function (Request $request) {
return Limit::perMinute(1)->by($request->user()->id)->response(function () {
return response()->json([
'invalid_request' => true,
'message' => 'Too many requests have been made. Please try again after a minute.',
], 200);
});
};
RateLimiter::for('rate_limiter_1', $rateLimiterHandler);
RateLimiter::for('rate_limiter_2', $rateLimiterHandler);