javascript - 在 Passport.js 中验证多个模型

标签 javascript node.js passport.js

所以在过去的一个小时里,我一直在寻找在 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/

相关文章:

javascript - 使用 react-router 并通过 Passport.js 进行身份验证 - 可能吗?

node.js - Node + Express 应用程序中的 Passport + Google token 不断向 Postman 的尝试抛出 'Unauthorized', token 良好且手动验证

javascript - Drupal 上的 Advagg 显示多个 css 和 js 文件?

javascript - 使用 ajax 将 HTML 文档附加到元素

Javascript/Node.js - 检查文件是否已更改

javascript - 通过 Passport 实例的快速路由中的路由分离

javascript - 如何在sequelize中使用数据库时区获取当前日期/时间

javascript - 使用 CSS 和 JavaScript 根据选择更改 Div 的边框颜色

node.js - 将 Node.js 应用程序推送到开发/生产服务器的工作流程

javascript - Passport 、蒙戈、 express 、购物车教程在发布请求后点击提交时滞后