使用 PassportJS 管理员登录

Admin Login With PassportJS

伙计们,我可以让用户注册和登录。但我想进行管理员登录。该管理员也将是用户。所以我试着做了一个ensureAdmin function。但它不起作用。 İt 总是重定向到登录页面。

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

有人可以帮我解决这个问题吗?

ensureAdmin 函数中,我在 if 语句中看到一个错误。

if(req.user = user) ...

除此之外,您正在完善流程。

User.find({"username":"Alp"}) 查询总是 return 用户名为 Alp 的用户。因此,您可以像这样重写函数:

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

据我了解,

  • 向用户文档添加新字段 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 的用户身份验证并将用户文档推送到此路径 req.user。所以现在我们的中间件 ensureAdmin 开始玩游戏了。它将检查管理员状态 isAdmin。如果 isAdmin 为真,它将推送到我们的控制器函数,否则将其抛给错误处理程序。