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

代码中verifyUser与verifyAdmin权限验证功能异常问题排查

权限验证函数修复方案(verifyUser/verifyAdmin失效问题)

问题现象

verifyUser与verifyAdmin权限验证功能完全失效:

  • verifyAdmin调用verifyToken成功解析用户信息后,无法通过user.isAdmin判断管理员身份
  • verifyUser无法执行用户身份匹配的验证逻辑

问题根源

  1. 参数传递错误:verifyToken仅接收req、res、next三个参数,但原代码中verifyUser和verifyAdmin调用时传入了第四个回调函数。由于verifyToken未处理该参数,执行完next()后直接进入后续中间件,导致自定义的权限判断逻辑完全不执行。
  2. 逻辑判断反转: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:33:04