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

已配置正确中间件仍出现Forbidden: Access denied错误排查求助

问题排查与解决

核心原因:中间件组合逻辑错误

你当前路由里用了router.use([vendorMiddleware, adminMiddleware]),这会依次执行两个中间件:

  • 当用户是admin时,vendorMiddleware会检查req.user.role === "vendor",不满足直接返回403
  • 当用户是vendor时,adminMiddleware(逻辑类似vendorMiddleware)会检查req.user.role === "admin",同样不满足返回403

这就是无论哪种身份都被拒绝的根本原因,和中间件本身功能无关。

修复方案

方案1:创建统一权限中间件(推荐)

直接写一个同时允许vendor和admin的中间件,逻辑更清晰:

function vendorOrAdminMiddleware(req, res, next) {
    if (req.user && (req.user.role === "vendor" || req.user.role === "admin")) {
        next();
    } else {
        return res.status(403).json({ msg: "Forbidden: Access denied!" });
    }
}

module.exports = vendorOrAdminMiddleware;

然后路由里替换成:

router.use(vendorOrAdminMiddleware);

方案2:修改原有中间件逻辑(不推荐)

如果要保留两个独立中间件,得调整逻辑,让不满足当前角色的请求能进入下一个中间件判断:

// 修改后的vendorMiddleware
function vendorMiddleware(req, res, next) {
    if (req.user && req.user.role === "vendor") {
        next();
    } else {
        // 不直接返回,交给下一个中间件判断
        next('route');
    }
}

// 修改后的adminMiddleware
function adminMiddleware(req, res, next) {
    if (req.user && req.user.role === "admin") {
        next();
    } else {
        return res.status(403).json({ msg: "Forbidden: Access denied!" });
    }
}

路由里使用:

router.use(vendorMiddleware, adminMiddleware);

额外检查点:Mongoose鉴别器导出问题

你当前模型文件最后导出的是Service = mongoose.model('Service', ServiceSchema),但路由里用到了VenueService,如果路由文件没正确导入这个鉴别器,会导致实例化失败。需要确保模型文件导出所有鉴别器:

// 模型文件末尾修改导出
module.exports = {
    BaseService,
    CateringService,
    VenueService,
    PhotographyService,
    DecorService
};

然后在路由文件里正确导入:

const { VenueService } = require('../models/your-service-model-file');

验证步骤

  1. 替换中间件为统一权限判断逻辑
  2. 确认路由里正确导入VenueService
  3. 重启服务后,用admin和vendor身份分别测试/newvenue接口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:16:07