145 votes

Création d'un middleware expressjs qui accepte des paramètres

J'essaie de créer un intergiciel 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();
}

205voto

Jonathan Ong Points 5464
function HasRole(role) {
  return function(req, res, next) {
    if (role !== req.user.role) res.redirect(...);
    else next();
  }
}

Je veux aussi m'assurer que je ne fais pas 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();
  })
}

23voto

chovy Points 8012
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();
};

10voto

jarraga Points 69

J'utilise cette solution. Je reçois un jeton jwt dans le corps de la demande, et je récupère les 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 }

J'utilise d'abord le middleware d'authentification pour savoir si l'utilisateur est 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

8voto

zevero Points 29

Alternativement, si vous n'avez pas trop de cas ou si role 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) {

})

3voto

walteronassis Points 11

Si vous avez plusieurs niveaux d'autorisation, vous pouvez les structurer de la manière suivante :

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();
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X