2017-10-10 1 views
0

donc depuis une heure j'ai cherché le moyen d'authentifier plusieurs modèles dans un login dans passport.js sans succès. Mon application a 2 modèles, enseignant et étudiant, je voulais faire une page de connexion pour vérifier qu'il est enseignant ou étudiant, puis connectez-vous, j'ai essayé de sérialiser et de désérialiser ces deux modèles dans app.js, mais il semble qu'il ne sait pas lequel authentifier, est-il possible de le faire?Authentifier plusieurs modèles dans passport.js

Modifier: J'ai un champ de position dans ma collection d'étudiants et d'enseignants, 1 pour l'étudiant et 2 pour l'enseignant. Il semble que le passport.use() soit écrasé par le deuxième appel passport.use(), par conséquent, je ne peux me connecter que via Student, et si je les retourne, je peux me connecter à Teacher.

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.use(new localStrategyTeacher (Teacher.authenticate())); 
passport.use(new localStrategyStudent (Student.authenticate())); 

passport.serializeUser((user, done) => { 
    let type; 
    if (user.position === 1) { 
     type = 'student'; 
    } else { 
     type = 'teacher'; 
    } 

    done(null, {id: user.id, type}); 
}); 

passport.deserializeUser((key, done) => { 
    if(key.type === 'student'){ 
     Student.findById(key.id, function(err, user) { 
      done(err, user); 
     }); 
     } else { 
     Teacher.findById(key.id, function(err, user) { 
      done(err, user); 
     }); 
     } 
}); 

Répondre

0

Désolé, je n'ai pas un score assez élevé pour faire un commentaire :). Sans un plus grand bout, il est un peu difficile à dire, mais il semble que la question du passeport, peut fournir la réponse que vous cherchez

https://github.com/jaredhanson/passport/issues/50

Et votre passport.serializeUser et deserializeUser aurait besoin d'être un peu plus compliqué, exemple. (pas testé désolé)

passport.serializeUser(function(user, done) { 
    let type = user.isTeacher() ? 'teacher' : 'student'; 
    done(null, { id: user.id, type: type}); 
}); 

passport.deserializeUser(function(data, done) { 
    if(data.type === 'student'){ 
    Student.findById(data.id, function(err, user) { 
     done(err, user); 
    }); 
    } else{ 
    Teacher.findById(data.id, function(err, user) { 
     done(err, user); 
    }); 
    } 
}); 
+0

Merci pour la réponse, mais cela n'a pas fonctionné de mon côté, j'ai mis à jour ma question. –

+0

En quoi cela n'a-t-il pas fonctionné? En regardant votre mise à jour, je peux voir une erreur dans le searlizer. La dernière ligne devrait être 'fait (null, {id: user.id, type: type})' –