节点 - 具有多个角色的路由器不工作

Node - Router with multiple roles not working

我有 4 个角色:普通用户是 auth,然后是 Support、Admin、MasterAdmin 在我只有用户和管理员之前,每个请求都很好。 现在我添加了 Support 和 MasterAdmin,并尝试在您是 Support、Admin 或 MasterAdmin 时获取请求。

const router = require('express').Router();
const paymentCtrl = require('../controllers/paymentCtrl');
const auth = require('../middleware/auth');
const authAdmin = require('../middleware/authAdmin');
const authMasterAdmin = require('../middleware/authMasterAdmin');
const authSupport = require('../middleware/authSupport');

router
  .route('/payment')
  .get(auth, authSupport || authMasterAdmin || authAdmin, paymentCtrl.getPayments)
  .post(auth, paymentCtrl.createPayPalPayment);

authSupport 例如 admin、MasterAdmin 与 user.role

的其他数字相同
const Users = require('../models/userModel');

const support = async (req, res, next) => {
  try {
    const user = await Users.findOne({ _id: req.user.id });

    if (user.role !== 2)
      return res.status(500).json({ msg: 'Support resources access denied.' });

    next();
  } catch (err) {
    return res.status(500).json({ msg: err.message });
  }
};

module.exports = support;

问题是我收到“支持资源访问被拒绝”。当我的用户是 Admin 或 MasterAdmin 时。 逻辑或“||”似乎不起作用。 当只有其中一个角色(支持、管理员或 MasterAdmin)为真时,我如何使请求起作用,有什么想法吗?

您不能使用||将中间件传递给路由器功能,您是在比较中间件,而不是它的结果。 所以你应该创建另一个中间件,你可以传递一组允许的角色。 像这样


const multiRolMiddleware = (roles) => {
  
  const allowedMasterAdmin = roles.includes('MASTER_ADMIN');
  const allowedAdmin = roles.includes('ADMIN');

   

  return (req,res,next) => {
   let isAuthenticated = false;
   if(allowedMasterAdmin && !isAuthenticated) {
// Do master admin auth here an set isAuthenticated to true if allowed.
}
if(allowedAdmin && !isAuthenticated)  {
  // Do admin auth here and set isAuthenticated to true id allowed

}
if(!isAuthenticated){
 return res.status(500).json({ msg: 'Support resources access denied.' });
}
next();
   };


}

// On your routes
router.get(multiRolMiddleware(['MASTER_ADMIN', 'ADMIN']), controller);