Node.js如何实现角色权限控制 仅允许商户上传停车场信息
仅商户角色上传停车场信息的实现方案
通过「角色校验中间件+路由层拦截」的方式即可修复权限漏洞,具体修改如下:
1. 新增商户角色校验中间件
在公共middleware文件中新增独立的角色校验逻辑,在token校验通过后判断用户账号类型:
// middleware目录下新增方法,可复用到所有仅商户可访问的接口 const checkMerchantRole = async (req, res, next) => { try { const user = await Auth.findById(req.data.id); if (!user) return res.status(404).json({ error: '用户不存在' }); if (user.accountType !== 'merchant') { return res.status(403).json({ error: '无操作权限,仅商户账号可上传停车场信息' }); } // 校验通过后将用户信息挂载到req对象,后续接口无需重复查库 req.currentUser = user; next(); } catch (error) { return res.status(500).json({ error: '权限校验异常' }); } };
2. 优化停车场新增接口代码
原接口存在两处可优化点:一是重复查询用户信息,二是catch块未返回正确HTTP状态码,修改后代码如下:
exports.parkingAdd = async (req, res) => { try { const { parkingName, price, address, name, phoneNumber, about, parkingType, city, state, zipCode } = req.body; // 角色校验已经在中间件完成,无需重复查询用户 const new_parking = new Parking({ merchantId: req.data.id, parkingName, price, contactInfo: { name, phoneNumber }, about, parkingType, address: { address, city, state, zipCode } }); const save = await new_parking.save(); return res.status(200).json({ success: true, msg: "停车场信息添加成功", data: { parkingDetails: save }, }); } catch (error) { // 修正原逻辑问题:异常时返回500状态码,而非直接返回错误字符串 return res.status(500).json({ error: error.message }); } }
3. 调整路由配置
将角色校验中间件加入路由处理链,注意中间件顺序不可调换:必须先校验token合法性,再校验角色,最后执行业务逻辑:
routing.post("/parking/add", middleware.authenticateToken, middleware.checkMerchantRole, merchant.parkingAdd);
注意事项
- 禁止调换中间件顺序:如果把角色校验放在token校验之前,会出现未登录用户直接触发数据库查询的异常
- 抽离独立中间件而非在接口内写校验逻辑,后续新增商户专属接口时可以直接复用该中间件,减少重复代码
- 权限不足时返回
403 Forbidden状态码,符合HTTP接口规范
内容的提问来源于stack exchange,提问作者user19038939
相关产品推荐
相关产品推荐

