如何基于用户ID(userId)配置请求速率限制器(rate limiter)?
基于用户ID(userId)配置express-rate-limit速率限制器
当然可以实现基于userId的限流,express-rate-limit提供了keyGenerator配置项,允许你自定义限流的标识依据,替代默认的IP地址。
修改后的示例代码
import rateLimit from 'express-rate-limit' const apiLimiter = rateLimit({ windowMs: 10000, // 10秒 max: 1, standardHeaders: true, legacyHeaders: false, // 自定义限流标识生成函数 keyGenerator: (req) => { // 假设用户已登录,userId存储在req.user对象中 // 如果你的userId是从token解析或其他方式获取,替换成对应的取值逻辑 if (req.user?.userId) { return req.user.userId; } // 未登录用户 fallback 到IP限流,避免匿名用户无限制请求 return req.ip; } }) app.use('/api', apiLimiter, /* 你的接口处理逻辑 */)
关键说明
keyGenerator函数接收请求对象req作为参数,返回的字符串会作为限流的唯一标识。- 你需要确保
req.user.userId是正确的用户标识来源,比如从JWT解析后挂载到req对象,或者从session中获取,根据你的鉴权逻辑调整即可。 - 保留未登录用户的IP限流逻辑,能避免匿名用户绕过限制,提升接口安全性。
内容的提问来源于stack exchange,提问作者dark
相关产品推荐
相关产品推荐

