2016-11-23 23 views
0

我有兩種不同類型的用戶的本地策略:學生和教師。我無法登錄,因爲我的序列化無法正常工作。序列化PassportJS中的不同類型的用戶

我有兩個模型,學生和老師。兩者都有獨立的集合,學生和老師的模式相似。兩者都有類似的功能:

module.exports.getStudentByUsername = function(username, callback){ 
    var query = {username: username}; 
    User.findOne(query, callback); 
} 

module.exports.getStudentById = function(id, callback){ 
    User.findById(id, callback); 
} 

module.exports.comparePassword = function(candidatePassword, hash, callback){ 
    bcrypt.compare(candidatePassword, hash, function(err, isMatch) { 
     if(err) throw err; 
     callback(null, isMatch); 
    }); 
} 

我的兩個本地策略是:

passport.use('student-local', new LocalStrategy(
    function(username, password, done) { 
     Student.getStudentByUsername(username, function(err, student){ 
      if(err) throw err; 
      if(!student){ 
       return done(null, false, {message: 'Unknown Student'}); 
      } 
      Student.comparePassword(password, student.password, function(err, isMatch){ 
       if(err) throw err; 
       if(isMatch){ 
        return done(null, student); 
       } else { 
        return done(null, false, {message: 'Invalid password'}); 
       } 
      }); 
     }); 
    })); 

passport.use('teacher-local', new LocalStrategy(
    function(username, password, done) { 
     Teacher.getTeacherByUsername(username, function(err, teacher){ 
     if(err) throw err; 
     if(!teacher){ 
      return done(null, false, {message: 'Unknown Teacher'}); 
     } 
     Teacher.comparePassword(password, teacher.password, function(err, isMatch){ 
       if(err) throw err; 
       if(isMatch){ 
        return done(null, teacher); 
       } else { 
        return done(null, false, {message: 'Invalid password'}); 
       } 
      }); 
     }); 
    })); 

我的兩個登錄是:

router.post('/loginStudent', 
passport.authenticate('student-local', {successRedirect:'/users/student', failureRedirect:'/login',failureFlash: true}), 
function(req, res) { 
    res.redirect('/'); 
}); 

router.post('/loginTeacher', 
passport.authenticate('teacher-local', {successRedirect:'/users/teacher', failureRedirect:'/login',failureFlash: true}), 
function(req, res) { 
    res.redirect('/'); 
}); 

我的序列化和反序列化是:

passport.serializeUser(function(user, done) { 
    if(Student.findOne({username: user.username}).length != 0) { 
     done(null, user.id); 
    } else if(Teacher.findOne({username: user.username}).length != 0) { 
     done(null, user.id); 
    } 
}); 

passport.deserializeUser(function(id, done) { 
    if(Student.getStudentById(id)){ 
     Student.getTeacherById(id, function(err, user) { 
      done(err, user); 
     }); 
    } else { 
     Teacher.getTeacherById(id, function(err, user) { 
      done(err, user); 
     }); 
    } 
}); 

我知道我的seria升級是錯誤的,這就是爲什麼我無法得到這個工作。當我只用一種類型的用戶進行嘗試時,以及我在護照文檔中發現的更簡單的序列號時,我的登錄工作正常。我對節點和護照有所瞭解,因此任何幫助都將不勝感激。

回答

0

我相信你的序列化不起作用,因爲查找教師/學生的查詢實際上是異步的,並且你將它視爲同步。

passport.serializeUser(function(user, done) { 
    Student.findOne({ username: user.username }, function(err, student) { 
     if (student) { 
       // user is student 
       done(null, user.id); 
     } else { 
       Teacher.findOne({ username: user.username }, function(err, teacher) { 
        if (teacher) { 
         // user is teacher 
         done(null, user.id); 
        } 
       }); 
     } 
    }) 
}); 

這應該工作,雖然我不知道你爲什麼要查找的用戶類型。你可以這樣做:

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 
相關問題