如何修复特定卖家订单总收入被其他账号可见的问题?
解决卖家订单总收入的权限控制问题
核心问题分析
现有代码存在两个关键漏洞导致权限失控:
- 聚合查询硬编码了固定卖家ID,完全没有根据请求的目标卖家动态过滤订单
- 缺少身份验证与权限校验逻辑,任何未授权账号都能直接访问接口获取数据
分步解决方案
1. 添加身份验证中间件
先给路由加上身份验证拦截,确保只有已登录的用户能访问该接口。假设你使用JWT或类似认证机制,先挂载对应的中间件:
// authMiddleware为你的身份验证中间件,需将当前登录用户信息挂载到req.user router.get("/total/:id", authMiddleware, async (req, res) => { // 后续业务逻辑 });
2. 校验请求身份与目标卖家一致
在处理数据前,验证当前登录用户的ID和请求参数中的卖家ID完全匹配,直接拦截越权请求:
const { id } = req.params; // 假设当前登录用户的ID存储在req.user.id if (req.user.id !== id) { return res.status(403).json({ message: "无权访问该卖家的收入数据" }); }
3. 修改聚合查询,精准过滤当前卖家的订单
由于sellerId嵌套在products数组内,需要先展开数组再匹配卖家ID,最后分组计算总收入:
try { const income = await Order.aggregate([ // 展开products数组,让每个商品项成为独立文档 { $unwind: "$products" }, // 只保留当前卖家关联的订单记录 { $match: { "products.sellerId": id } }, // 按卖家ID分组,计算总收入 { $group: { _id: id, total: { $sum: "$amount" } } } ]); // 无数据时返回默认值,避免返回空数组 res.status(200).json(income.length ? income[0] : { _id: id, total: 0 }); } catch (err) { res.status(500).json(err); }
完整修改后的路由代码
router.get("/total/:id", authMiddleware, async (req, res) => { const { id } = req.params; // 权限校验:仅允许访问自身的收入数据 if (req.user.id !== id) { return res.status(403).json({ message: "无权访问该卖家的收入数据" }); } try { const income = await Order.aggregate([ { $unwind: "$products" }, { $match: { "products.sellerId": id } }, { $group: { _id: id, total: { $sum: "$amount" } } } ]); res.status(200).json(income.length ? income[0] : { _id: id, total: 0 }); } catch (err) { res.status(500).json(err); } });
额外注意事项
- 确保
authMiddleware能正确识别用户身份,将用户ID挂载到req.user.id - 如果
sellerId是MongoDB的ObjectId类型而非字符串,需将参数id转换后再匹配:{ $match: { "products.sellerId": mongoose.Types.ObjectId(id) } }
内容的提问来源于stack exchange,提问作者Stykgwar
相关产品推荐
相关产品推荐

