laravel - 如何对任何经过身份验证的用户使用 API 速率限制?
问题描述
例如:我希望 每 15 分钟允许 500 个请求(来自任何登录用户)的 API 路由
- 登录 用户 A 请求 API => 499 剩余
- 登录 用户 B 请求 API => 498 剩余
*API 速率限制将在 15 分钟后重置
如何做这样的事情?
解决方案
向数据库中的用户表添加limit
和limit_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');
推荐阅读
- azure - 如何在 Azure AD B2C 中创建仅电子邮件页面?
- python-3.x - 在 tkinter 中添加滚动条
- javascript - JS reducer 返回对象
- haskell - 如何加入两个 Haskell IO monad
- angular - 如果表单仍然相同,则阻止用户提交表单
- javascript - 在需要回调(例如 Array.map)的循环中使用 async/await 时,究竟是什么影响了 fs.writeFile 的行为?
- ruby - 使 Ruby 文件在 Windows 10 中可执行
- azure - 在 Azure 逻辑应用程序中,我们如何验证 json 正文中是否存在任何字段
- python - 如何根据字典列表中另一个键的值获取键的最小值?
- jenkins - Jenkins管道:仅当管道成功时才接受合并请求