代码中verifyUser与verifyAdmin权限验证功能异常问题排查
权限验证函数修复方案(verifyUser/verifyAdmin失效问题)
问题现象
verifyUser与verifyAdmin权限验证功能完全失效:
- verifyAdmin调用verifyToken成功解析用户信息后,无法通过
user.isAdmin判断管理员身份 - verifyUser无法执行用户身份匹配的验证逻辑
问题根源
- 参数传递错误:verifyToken仅接收
req、res、next三个参数,但原代码中verifyUser和verifyAdmin调用时传入了第四个回调函数。由于verifyToken未处理该参数,执行完next()后直接进入后续中间件,导致自定义的权限判断逻辑完全不执行。 - 逻辑判断反转:verifyAdmin中的权限判断逻辑写反,原逻辑允许非管理员通过,反而拦截管理员请求。
修复后的完整代码
import jwt from "jsonwebtoken"; import { createError } from "../utils/error.js"; // 验证Token有效性 export const verifyToken = (req, res, next) => { const token = req.cookies.access_token; if (!token) { return next(createError(401, "You are not authenticated!")); } jwt.verify(token, process.env.JWT, (err, user) => { if (err) return next(createError(403, "Token is not valid!")); req.user = user; next(); }); }; // 验证用户权限(自身或管理员) export const verifyUser = (req, res, next) => { verifyToken(req, res, () => { if (req.user.id === req.params.id || req.user.isAdmin) { next(); } else { return next(createError(403, "You are not authorized!")); } }); }; // 验证管理员权限 export const verifyAdmin = (req, res, next) => { verifyToken(req, res, () => { if (req.user.isAdmin) { next(); } else { return next(createError(403, "You are not authorized!")); } }); };
修复说明
- 修正参数传递:将verifyUser和verifyAdmin中传给verifyToken的回调函数作为第三个参数(即verifyToken的
next参数),确保Token验证通过后,能执行自定义的权限判断逻辑。 - 反转管理员判断逻辑:调整verifyAdmin的条件,仅当用户是管理员时才允许通过请求,否则返回权限错误。
内容的提问来源于stack exchange,提问作者Jainish Parekh
相关产品推荐
相关产品推荐

