Вход администратора с помощью PassportJS - PullRequest
0 голосов
/ 18 июня 2020

Ребят я могу сделать регистрацию пользователя и логин. Но я хочу сделать логин админа. Этот администратор тоже будет пользователем. Так что попробовал сделать ensureAdmin function. Но не работает. Он всегда перенаправляет на страницу входа.

passport.use(new LocalStrategy({
      usernameField: 'username',
      passwordField: 'password'
    },
      function(username, password, done) {
        User.findOne({ username: username }, function (err, user) {
          if (err) { return done(err); }
          if (!user) {
            return done(null, false, { message: 'Incorrect username.' });
          }
           bcrypt.compare(password, user.password, function(err, isMatch){
            if(err) throw err;
            if(isMatch){
              return done(null, user);
            } else {
              return done(null, false, {message: 'Wrong password'});
            }
          });
        });
      }
    ));

    function ensureAdmin(req, res, next){
      User.find({"username":"Alp"}
      ).exec(function(user){
      if(req.user = user){
        req.isAuthenticated()
        return next();
      } else {
        req.flash('danger', 'Please Login');
        res.redirect('/login');
      }
    });
    }

Может ли кто-нибудь помочь мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

В функции ensureAdmin я вижу ошибку в операторе if.

if(req.user = user) ...

Помимо этого, вы завершаете поток.

User.find({"username":"Alp"}) запрос всегда возвращает пользователя с именем пользователя Alp. Итак, вы можете переписать функцию так:

function ensureAdmin(req, res, next){
    if(req.user.username === 'Alp'){
        req.isAuthenticated()
        return next();
    } else {
        req.flash('danger', 'Please Login');
        res.redirect('/login');
    }
}
0 голосов
/ 18 июня 2020

Насколько я понимаю,

  • Добавьте новое поле в пользовательский документ как isAdmin
  • Затем создайте новое промежуточное ПО как ensureAdmin
const ensureAdmin = (req, res, next) => {
    if (!req.user){
        return next(new Error("User Document not found."));
    }
    if (!req.user.isAdmin){
        return next(new Error("User not authorized to access this route."));
    }
    return next();
}

Вы можете использовать его так, где это необходимо:

app.post("/signin", passportLogin, ensureAdmin, controller.signin);

Это сначала проверит аутентификацию пользователя из passportLogin и pu sh документа пользователя по этому пути req.user. Итак, теперь наше промежуточное ПО ensureAdmin играет в игру. Он проверит статус администратора isAdmin. Если isAdmin истинно, он передаст sh нашей функции контроллера, в противном случае передаст его обработчикам ошибок.

...