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

Node Router用户更新接口权限校验写法纠错咨询

问题修正与解决方案

你写的 verifyTokenAndAuthorization / verifyTokenAndAdmin 是完全错误的写法——斜杠在这里是JavaScript的除法运算符,根本无法实现你需要的「或」权限校验逻辑。Express路由中间件默认是且的关系(所有传入的中间件必须全部通过才能进入后续处理),要实现「已登录用户(可修改自己账号)或管理员」的权限逻辑,需要自定义中间件来处理。

具体修正步骤

1. 先明确基础权限中间件的逻辑

假设你已有的两个中间件逻辑如下(如果没有实现,可参考以下代码):

// 基础Token验证中间件
const verifyToken = (req, res, next) => {
  const token = req.headers.authorization?.split(" ")[1];
  if (!token) return res.status(401).json("未授权:缺少Token");
  
  try {
    const decoded = jwt.verify(token, process.env.JWT_SEC);
    req.user = decoded;
    next();
  } catch (err) {
    res.status(403).json("未授权:无效Token");
  }
};

// 验证用户可操作自己账号
const verifyTokenAndAuthorization = (req, res, next) => {
  verifyToken(req, res, () => {
    if (req.user.id === req.params.id) next();
    else res.status(403).json("无权限:仅可修改自己的账号");
  });
};

// 验证管理员权限
const verifyTokenAndAdmin = (req, res, next) => {
  verifyToken(req, res, () => {
    if (req.user.isAdmin) next();
    else res.status(403).json("无权限:仅管理员可执行此操作");
  });
};

2. 自定义「或」逻辑的中间件

直接合并两个权限的判断逻辑,实现「满足任意一个条件即可通过」:

const verifyAuthOrAdmin = (req, res, next) => {
  verifyToken(req, res, () => {
    // 管理员 或 当前用户ID与请求的用户ID匹配,即可通过
    if (req.user.isAdmin || req.user.id === req.params.id) {
      next();
    } else {
      res.status(403).json("无权限执行此操作");
    }
  });
};

3. 修改路由并修正加密密钥问题

将路由的中间件替换为自定义的verifyAuthOrAdmin,同时注意你代码中加密密钥的错误:"process.env.PASS_SEC"加了引号会把字符串本身当密钥,要去掉引号读取环境变量:

router.put("/:id", verifyAuthOrAdmin, async (req, res) => {
  if (req.body.password) {
    // 去掉引号,正确读取环境变量中的加密密钥
    req.body.password = CryptoJS.AES.encrypt(req.body.password, process.env.PASS_SEC).toString();
  }

  try {
    const updatedUser = await User.findByIdAndUpdate(
      req.params.id,
      { $set: req.body },
      { new: true }
    );
    res.status(200).json(updatedUser);
  } catch (err) {
    res.status(500).json(err);
  }
});

内容的提问来源于stack exchange,提问作者Sahil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:15:13