cool-admin(midway版)后端API限流基于用户Token的限流实现指南 【免费下载链接】cool-admin-midway cool-admin(midway版)一个很酷的后台权限管理框架模块化、插件化、CRUD极速开发永久开源免费基于midway.js 3.x、typescript、typeorm、mysql、jwt、vue3、vite、element-ui等构建项目地址: https://gitcode.com/gh_mirrors/co/cool-admin-midwaycool-admin(midway版)是一个基于Midway.js 3.x构建的现代化后台权限管理框架它提供了强大的模块化、插件化和CRUD极速开发能力。在实际生产环境中API限流是保护系统免受恶意攻击和保证服务稳定性的重要手段。本文将详细介绍如何在cool-admin中实现基于用户Token的API限流功能。为什么需要API限流在现代化的Web应用中API接口面临着各种安全挑战DDoS攻击恶意用户通过大量请求压垮服务器暴力破解攻击者尝试猜测用户密码或Token资源滥用某些用户过度使用API资源系统稳定性保证所有用户都能公平使用服务基于用户Token的限流方案能够精准控制每个用户的访问频率相比IP限流更加灵活和安全。cool-admin的权限认证机制 在实现限流之前我们先了解cool-admin现有的权限认证机制。cool-admin使用JWTJSON Web Token进行用户认证Token中包含了用户的基本信息和权限数据。Token生成与验证流程用户登录用户提供用户名和密码系统验证后生成TokenToken存储Token存储在缓存中用于后续验证权限校验每个请求通过中间件验证Token的有效性权限控制根据Token中的权限信息控制接口访问核心配置文件JWT配置src/modules/base/config.ts权限中间件src/modules/base/middleware/authority.ts登录服务src/modules/base/service/sys/login.ts基于Token的限流实现方案 ⚡1. 限流策略设计我们采用令牌桶算法实现限流每个用户拥有独立的令牌桶。主要参数包括capacity令牌桶容量refillRate令牌填充速率windowSize时间窗口大小2. 限流中间件实现在cool-admin的权限中间件基础上我们可以添加限流功能// 限流中间件示例 Middleware() export class RateLimitMiddleware implements IMiddlewareContext, NextFunction { InjectClient(CachingFactory, default) midwayCache: MidwayCache; Config(module.base) coolConfig; resolve() { return async (ctx: Context, next: NextFunction) { const token ctx.get(Authorization); if (!token) { await next(); return; } try { const decoded jwt.verify(token, this.coolConfig.jwt.secret); const userId decoded.userId; // 检查用户限流状态 const isAllowed await this.checkRateLimit(userId); if (!isAllowed) { throw new CoolCommException(请求过于频繁请稍后再试, 429); } await next(); } catch (error) { // Token无效或限流检查失败 await next(); } }; } async checkRateLimit(userId: string): Promiseboolean { const key rate_limit:${userId}; const now Date.now(); const windowSize 60 * 1000; // 1分钟 const maxRequests 60; // 每分钟最大请求数 // 获取用户当前时间窗口的请求记录 const requests await this.midwayCache.get(key) || []; // 清理过期请求 const validRequests requests.filter(time now - time windowSize); if (validRequests.length maxRequests) { return false; } // 记录本次请求 validRequests.push(now); await this.midwayCache.set(key, validRequests, windowSize / 1000); return true; } }3. 配置限流规则在模块配置中添加限流参数// 在config.ts中添加限流配置 export default () { return { // ... 其他配置 rateLimit: { // 全局默认配置 default: { windowMs: 60 * 1000, // 1分钟 max: 60, // 每分钟最多60次请求 message: 请求过于频繁请稍后再试, statusCode: 429 }, // 按接口类型配置 admin: { windowMs: 60 * 1000, max: 30 // 管理接口限制更严格 }, app: { windowMs: 60 * 1000, max: 100 // 应用接口限制较宽松 } } }; };高级限流功能 1. 动态限流配置实现根据用户角色动态调整限流策略async getRateLimitConfig(userId: string, roleIds: number[]) { // 根据用户角色获取不同的限流配置 if (roleIds.includes(1)) { // 管理员 return { windowMs: 60000, max: 100 }; } else if (roleIds.includes(2)) { // VIP用户 return { windowMs: 60000, max: 200 }; } else { // 普通用户 return { windowMs: 60000, max: 60 }; } }2. 接口级别限流为不同的API接口设置不同的限流策略// 在控制器中使用装饰器 CoolController({ api: [add, delete, update, info, list, page], entity: DemoAppGoodsEntity, rateLimit: { windowMs: 60000, max: 30 } }) export class DemoAppGoodsController extends BaseController { // 特定接口单独设置限流 Get(/special) RateLimit({ windowMs: 60000, max: 10 }) async special() { return this.ok(特殊接口); } }3. 分布式限流支持对于集群部署环境使用Redis实现分布式限流async checkDistributedRateLimit(userId: string): Promiseboolean { const key rate_limit:${userId}; const now Math.floor(Date.now() / 1000); const windowSize 60; // 60秒 const maxRequests 60; // 使用Redis的Lua脚本保证原子性 const luaScript local key KEYS[1] local now tonumber(ARGV[1]) local window tonumber(ARGV[2]) local max tonumber(ARGV[3]) -- 清理过期记录 redis.call(ZREMRANGEBYSCORE, key, 0, now - window) -- 获取当前请求数 local current redis.call(ZCARD, key) if current max then -- 添加当前请求时间戳 redis.call(ZADD, key, now, now) redis.call(EXPIRE, key, window) return 1 else return 0 end ; const result await this.redisClient.eval( luaScript, 1, key, now.toString(), windowSize.toString(), maxRequests.toString() ); return result 1; }最佳实践建议 1. 渐进式限流策略建议采用渐进式的限流策略宽松期新用户给予较高的请求限额稳定期根据用户行为调整限额惩罚期对异常行为进行严格限制2. 监控与告警实现限流监控系统记录被限流的请求统计各用户的请求频率设置告警阈值3. 用户体验优化清晰的错误提示返回429状态码和友好的提示信息重试建议告诉用户何时可以重试配额显示在响应头中显示剩余请求次数总结 cool-admin(midway版)基于用户Token的API限流实现不仅能够有效防止恶意攻击还能保证系统的稳定性和公平性。通过结合cool-admin现有的权限认证机制我们可以实现细粒度的限流控制为不同用户和接口提供差异化的访问策略。核心优势✅ 基于Token的精准限流✅ 支持动态配置和接口级控制✅ 兼容分布式部署环境✅ 与现有权限体系无缝集成适用场景 防止暴力破解和DDoS攻击⚖️ 保证资源公平分配 监控API使用情况 提升系统稳定性通过本文介绍的实现方案你可以在cool-admin项目中轻松添加API限流功能为你的应用增加一层重要的安全防护。【免费下载链接】cool-admin-midway cool-admin(midway版)一个很酷的后台权限管理框架模块化、插件化、CRUD极速开发永久开源免费基于midway.js 3.x、typescript、typeorm、mysql、jwt、vue3、vite、element-ui等构建项目地址: https://gitcode.com/gh_mirrors/co/cool-admin-midway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考