Próbuję utworzyć oprogramowanie pośredniczące, które może akceptować parametry. Jak można to zrobić?
przykład
app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){
})
HasRole = function(role, req, res, next){
if(role != user.role){
res.redirect('/NotInRole);
}
next();
}
Odpowiedzi:
function HasRole(role) { return function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); } }
Chcę się również upewnić, że nie wykonuję wielu kopii tej samej funkcji:
function HasRole(role) { return HasRole[role] || (HasRole[role] = function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); }) }
źródło
app.get('/a', hasRole('admin'))
iapp.get('/b', hasRole('admin'))
utworzy nowe zamknięcie dla każdegohasRole
. realistycznie nie ma to większego znaczenia, chyba że masz naprawdę dużą aplikację. po prostu domyślnie koduję w ten sposób.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(); };
źródło
Alternatywnie, jeśli nie masz zbyt wielu przypadków lub jeśli rola NIE jest ciągiem znaków:
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) { })
źródło
Jeśli masz różne poziomy uprawnień, możesz je uporządkować w ten sposób:
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(); } }
źródło
Używam tego rozwiązania. Otrzymuję token jwt w body req i stamtąd otrzymuję informacje o roli
//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 }
Najpierw używam oprogramowania pośredniego uwierzytelniania, aby wiedzieć, czy jest prawidłowym użytkownikiem, a następnie oprogramowania pośredniczącego roli, aby wiedzieć, czy użytkownik ma dostęp do trasy interfejsu API
// router.js router.post('/v1/something-protected', requireAuth, checkRole('commercial'), (req, res) => { // do what you want... })
Mam nadzieję, że będę przydatny
źródło