Express路由权限校验:无需新增函数实现isSameUser或isAdmin判断
问题分析与解决方案
你原来的写法isSameUser || isAdmin根本达不到“或”的效果——JavaScript里||会直接返回第一个真值(这里两个都是函数,所以直接返回isSameUser),isAdmin从来不会被执行,这就是为什么某场景失效。
不用单独创建命名函数的话,可以直接用匿名中间件封装两个判断逻辑,实现“二选一通过”的效果:
方案1:直接在匿名中间件里写判断逻辑
如果isSameUser和isAdmin的判断逻辑比较简单,可以直接写在匿名函数里:
router.get('/:id', isSigned, (req, res, next) => { // 判断是否是同一用户 const isSame = req.user.id === req.params.id; // 判断是否是管理员 const isAdmin = req.user.role === 'admin'; if (isSame || isAdmin) { next(); // 满足任一条件,继续执行后续中间件 } else { res.status(403).send('无权访问'); // 都不满足,返回403 } }, getUser);
方案2:复用已有的isSameUser和isAdmin中间件
如果这两个中间件已经封装了复杂逻辑不想重复写,可以在匿名中间件里依次调用它们,通过自定义next回调来判断是否通过:
router.get('/:id', isSigned, (req, res, next) => { // 先尝试isSameUser中间件 isSameUser(req, res, (sameErr) => { if (!sameErr) { // isSameUser通过,直接进入下一个中间件 return next(); } // isSameUser不通过,尝试isAdmin中间件 isAdmin(req, res, (adminErr) => { if (!adminErr) { return next(); } // 两个都不通过,返回权限错误 res.status(403).send('无权访问'); }); }); }, getUser);
这两种写法都不需要额外创建专用命名函数,直接在路由里实现“用户本人或管理员可访问”的校验逻辑。
内容的提问来源于stack exchange,提问作者Sn0w
相关产品推荐
相关产品推荐

