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
相关产品推荐
相关产品推荐

