所以在过去的一个小时里,我一直在寻找在 Passport.js 中登录时验证多个模型的方法,但没有成功。 我的应用程序有 2 个模型,教师和学生,我想制作一个登录页面来检查它是教师还是学生,然后登录它们,我尝试在 app.js 中序列化和反序列化这两个模型,但似乎没有不知道要验证哪一个,有什么办法可以做到这一点吗?
编辑: 我的学生和老师的集合中都有一个位置字段,1 为学生,2 为老师。 看来passport.use()被第二次passport.use()调用覆盖了,因此,我只能通过Student登录,如果我翻转它们,我可以登录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);
});
}
});
最佳答案
抱歉,我的分数不够高,无法发表评论:)。如果没有更大的片段,这有点难以判断,但似乎以下 Passport 问题可能会提供您正在寻找的答案
https://github.com/jaredhanson/passport/issues/50
例如,您的 Passport.serializeUser 和 deserializeUser 需要稍微复杂一些。 (抱歉,未经测试)
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);
});
}
});
关于javascript - 在 Passport.js 中验证多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46671265/