Express路由权限控制问题:实现Admin或Moderator二选一访问
解决角色校验的“或”逻辑问题
我明白你遇到的问题了——原来的路由同时挂载admin和moderator两个中间件,它们是依次执行且需要全部通过的,所以admin用户会被moderator中间件拦截,moderator用户会被admin中间件拦截,完全不符合你想要的“二选一”权限逻辑。
解决方案:创建一个合并的权限校验中间件
与其分开校验两个角色,不如写一个单独的中间件来判断用户是否是admin或moderator中的任意一个。这样既减少了重复的数据库查询,又能实现“或”逻辑。
步骤1:创建adminOrModerator中间件
const User = require('../models').User; module.exports = async function (req, res, next) { const user = await User.findOne({ where: { id: req.user.id } }); // 判断用户角色是否为admin或moderator if (user.role !== 'admin' && user.role !== 'moderator') { return res.status(403).send({ error: { status: 403, message: 'Access denied.' } }); } next(); };
步骤2:修改路由配置
把原来的[verify, admin, moderator]替换成[verify, adminOrModerator],这样只要用户是admin或moderator就能通过校验:
router.post('/store-detail', [verify, adminOrModerator], async (req, res) => { // 你的业务逻辑代码 });
额外优化:避免重复查询用户数据
如果你的verify中间件已经把用户信息挂载到req.user上了(比如解析JWT时已经包含了角色字段),那你甚至可以跳过再次查询数据库的步骤,直接用req.user.role来判断,这样效率更高:
// 假设verify中间件已经将角色信息存在req.user.role中 module.exports = function (req, res, next) { if (req.user.role !== 'admin' && req.user.role !== 'moderator') { return res.status(403).send({ error: { status: 403, message: 'Access denied.' } }); } next(); };
这样就能完美实现你需要的“admin或moderator均可访问”的权限逻辑啦!
内容的提问来源于stack exchange,提问作者Sujeet
相关产品推荐
相关产品推荐

