@KonstantoS

Express.js Как в middleware(ролевая система доступа) определить «next()» модуль или передать параметр?

Доброго времени суток, пилю систему с ролевой моделью доступа. Сейчас у меня каждый роутер - отдельный модуль. Хочется сделать что-то вроде такого:
var roleModule = require(./libs/roles);
var events = require('./controllers/events');

app.use(roleModule.hasPermission);
app.use('/events', events);
...

При этом, до вызова roleModule.hasPermission в req.currUser уже записаны данные про юзера (id,role..).
Хочу каким-то образом определить в какой модуль пытаются получить доступ, что б глянуть на разрешения.
Не хочется пилить велосипед через req.path. Также не хочется делать в каждом контроллере вот такого:
var roleModule = require(./libs/roles);
router.use(function(req,res,next){
        roleModule.hasPermission(req.currUser.role,'%moduleName%',function(permitted){
              if(permitted)
                  next();
        });
});

Может есть метод попроще? Мой вариант выше даст лишние строки кода, хочется лаконичнее.
  • Вопрос задан
  • 815 просмотров
Решения вопроса 1
@iShatokhin
JS developer
var roleModule = require(./libs/roles);
var checkRole = function (name) { // пишем middleware один раз и для всех, передаем имя роутера через замыкание
  return function (req, res, next) {
    roleModule.hasPermission(req.currUser.role, name, function(permitted){ // возвращать флаг первым параметром ОЧЕНЬ плохая практика, по соглашению в node.js первым аргумент в коллбеке должна быть ошибка
      if (permitted)
        next();
      else
        res.sendStatus(403);
    })
  }
}

var router = express.Router();
router.use(checkRole("%name")); // где name это имя вашего модуля
app.use('/user', router);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
edli007
@edli007
full stack, team lead
app.all( '/cabinet/*', checkRole, function( req, res, next){
    ....
    next();
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы