You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:36:26