J'essaye de créer un middleware qui peut accepter des paramètres. Comment cela peut-il être fait?
exemple
app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){
})
HasRole = function(role, req, res, next){
if(role != user.role){
res.redirect('/NotInRole);
}
next();
}
Réponses:
function HasRole(role) { return function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); } }
Je veux également m'assurer de ne pas faire plusieurs copies de la même fonction:
function HasRole(role) { return HasRole[role] || (HasRole[role] = function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); }) }
la source
app.get('/a', hasRole('admin'))
etapp.get('/b', hasRole('admin'))
créerait une nouvelle fermeture pour chacunhasRole
. cela n'a pas beaucoup d'importance de manière réaliste, sauf si vous avez une application vraiment volumineuse. je code juste comme ça par défaut.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(); };
la source
Sinon, si vous n'avez pas trop de cas ou si le rôle n'est PAS une chaîne:
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) { })
la source
Si vous avez différents niveaux d'autorisations, vous pouvez les structurer comme ceci:
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(); } }
la source
J'utilise cette solution. Je reçois un jeton jwt dans la demande de corps et j'obtiens des informations sur le rôle à partir de là
//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 }
Donc, j'utilise d'abord le middleware d'authentification pour savoir si est un utilisateur valide, puis le middleware de rôle pour savoir si l'utilisateur a accès à la route api
// router.js router.post('/v1/something-protected', requireAuth, checkRole('commercial'), (req, res) => { // do what you want... })
J'espère être utile
la source