节点 - 具有多个角色的路由器不工作
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);
我有 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);