Как авторизовать или запретить маршруты в Node.JS, если пользователь не соответствует условию?

Я разрабатываю проект для школы (NodeJS и MondoDB). Я пытаюсь заблокировать маршруты для пользователей без привилегий. В Jade я реализовал в макете следующее условие: if user.isAdmin == true. То есть во внешнем интерфейсе он блокирует маршрут и не отображается на панели навигации, если у пользователя нет проверенного флажка.

Я пытался сделать в бэкэнде, скажем, на маршруте:

route.get("/admin", function(req, res){
   if(req.body.isAdmin == true){
      res.render("app/admin");
   }else{
      /*Por ejemplo*/
      res.send("No es administrador");
   }
});

Но это относится к запросам, которые приходят из формы, верно? На всякий случай, я должен упомянуть, что у меня есть промежуточное программное обеспечение, которое обрабатывает сессии:

module.exports = function(req, res, next){
    if(!req.session.user_id){
        res.redirect("/login");
    }else{
        User.findById(req.session.user_id, function(err, user){
            if(err){
                console.log(err);
                res.redirect("/login");
            }else{
                res.locals = {user: user};
                next();
            }
        });
    }
}

Так как я могу обрабатывать данные текущего сеанса в бэкэнде?

1
задан 22.07.2016, 21:32
2 ответа

уже почти это у тебя есть, ввиду того, что твой middleware возвращает user и это помещает в res.locals только тебе остается просачиваться по этой стоимости.

 route.get('/admin', function(req, res, next) {
   if (!res.locals.user.isAdmin) {
     return res.sendStatus(401);
   }  

   // y sigues con la lógica de /admin
   res.send('Admin page');

 });
0
ответ дан 24.11.2019, 13:53
  • 1
    Спасибо за твой ответ друг. Этот res.locals помог достаточно. middleware, который он использует для autorizaci и # 243; n маршрутов qued и # 243; схвати и # 237;: var User = require ("./models/user").User; module.exports = function (req, домашнее животное, next) {User.findById (req.session.user_id, function (err, user) {if (user.isAdmin == true) {res.locals.user = user; next (); console.log (" Если у него есть разрешения administrador");} else if (user.isAdmin == false || user.isAdmin == null) {res.redirect (" / app"); console.log (" у него нет разрешений для acceder");}});} –   22.07.2016, 21:30

То, что ты делаешь, правильно. Поместив

route.get('/esta_ruta', function(req, res){
    //
});

маршрут уже задержан. Мы идем с примером. Если то, что ты хочешь сделать, состоит в том, чтобы предотвращать как можно более наверху в программе, что все просьбы в маршруты, которые начинаются с /admin внутри твоего ruter будьте видны только пользователями с разрешениями управления возможно делать:

// situar acá los middlewares de control de login
// supongo que la session calcula is_admin
route.get('/admin', function(req, res, next){
  if(req.session.is_admin){
    next(); // ok, podemos seguir
  }else{
    res.status(401);
    // acá se puede poner algo más amable
    res.end('no autorizado'); // no continua, informa no autorizado
  } 
});

route.get('/admin/users', function(req, res){
  // estoy seguro que es un admin
});

route.get('/admin/roles', function(req, res){
  // estoy seguro que es un admin
});
0
ответ дан 24.11.2019, 13:53