Я пытаюсь создать промежуточное ПО, которое может принимать параметры. Как это может быть сделано?
пример
app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){
})
HasRole = function(role, req, res, next){
if(role != user.role){
res.redirect('/NotInRole);
}
next();
}
Ответы:
function HasRole(role) { return function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); } }
Я также хочу убедиться, что я не делаю несколько копий одной и той же функции:
function HasRole(role) { return HasRole[role] || (HasRole[role] = function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); }) }
источник
app.get('/a', hasRole('admin'))
иapp.get('/b', hasRole('admin'))
создаст новое закрытие для каждогоhasRole
. в реальности это не имеет большого значения, если у вас нет действительно большого приложения. Я просто кодирую это по умолчанию.app.get('/hasToBeAdmin', (req, res, next) => { hasRole(req, res, next, 'admin'); }, (req,res) => { // regular route }); const hasRole = (req, res, next, role) => { if(role != user.role){ res.redirect('/NotInRole'); } next(); };
источник
В качестве альтернативы, если у вас не слишком много кейсов или если роль НЕ является строкой:
function HasRole(role) { return function (req, res, next) { if (role !== req.user.role) res.redirect(/* ... */); else next(); } } var middlware_hasRoleAdmin = HasRole('admin'); // define router only once app.get('/hasToBeAdmin', middlware_hasRoleAdmin, function (req, res) { })
источник
Если у вас есть разные уровни разрешений, вы можете структурировать их следующим образом:
const LEVELS = Object.freeze({ basic: 1, pro: 2, admin: 3 }); /** * Check if user has the required permission level */ module.exports = (role) => { return (req, res, next) => { if (LEVELS[req.user.role] < LEVELS[role]) return res.status(401).end(); return next(); } }
источник
Пользуюсь этим решением. Я получаю токен jwt в теле req и получаю оттуда информацию о ролях
//roleMiddleware.js const checkRole = role => { return (req, res, next) => { if (req.role == role) { console.log(`${role} role granted`) next() } else { res.status(401).send({ result: 'error', message: `No ${role} permission granted` }) } } } module.exports = { checkRole }
Итак, сначала я использую промежуточное программное обеспечение auth, чтобы узнать, является ли пользователь действительным, а затем промежуточное программное обеспечение роли, чтобы узнать, есть ли у пользователя доступ к маршруту api.
// router.js router.post('/v1/something-protected', requireAuth, checkRole('commercial'), (req, res) => { // do what you want... })
Я надеюсь быть полезным
источник