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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:50:26