已配置正确中间件仍出现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');
验证步骤
- 替换中间件为统一权限判断逻辑
- 确认路由里正确导入
VenueService - 重启服务后,用admin和vendor身份分别测试
/newvenue接口
内容的提问来源于stack exchange,提问作者AZ689
相关产品推荐
相关产品推荐

