繁体   English   中英

具有基本身份验证的用户的 Laravel 速率限制 api

[英]Laravel Rate limit api by user with basic auth

我正在尝试使用 api.php 中的 Basic Auth 在 api 路由上设置用户速率限制,但似乎 auth 用户信息没有传递给 RateLimiter,因为我收到错误“尝试读取 null 上的属性 id ”。 这是我在 configureRateLimit() 上的代码

路由服务提供者.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 时,它显示正常

路由服务提供者.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);
    });
});
}

首先检查登录用户

对于使用 Laravel 8 或更高版本和 sanctum 生成令牌的人。

以下代码将有助于在您想要限制某些用户的地方明智地实施速率限制用户。

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);
            });
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM