首页 > 解决方案 > 如何对任何经过身份验证的用户使用 API 速率限制?

问题描述

例如:我希望 每 15 分钟允许 500 个请求(来自任何登录用户)的 API 路由

*API 速率限制将在 15 分钟后重置

如何做这样的事情?

标签: laravel

解决方案


向数据库中的用户表添加limitlimit_created_at列,并使用类似代码创建中间件:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class AuthLimitMiddleware
{

    public function handle($request, Closure $next, $guard = null)
    {
        $user = Auth::user(); //or your get user method

        DB::table('users')->where('id', $user->id)->increment('limit');

        if ($user->limit_created_at + 60 * 15 > time()) {
           $user->limit = 0;
           $user->limit_craeted_at = now();
           $user->save();
        }

        if ($user->limit > 500) {
             throw new ConflictHttpException('limit is more for 500')
        }

        return $next($request);
    }
}

现在在内核文件中注册中间件:

protected $routeMiddleware = [
 ...
  'limit' => \App\Http\Middleware\AuthLimitMiddleware::class,
];

并在路线上使用它:

Route::get('some/route')->middleware('auth', 'limit');

推荐阅读