【问题标题】:passport.js multiple de/serialize methodspassport.js 多种反序列化方法
【发布时间】:2018-02-04 10:40:01
【问题描述】:

我正在构建一个由两部分组成的登录系统。用户登录主账号Accountmodel,这个账号将拥有多个团队Teammodel的访问权限,一个账号每个团队Usermodel可以有1个用户。问题是我可以使用护照定义Account 登录策略,但我只能使用Account 模型进行序列化和反序列化,但是当我想使用他们的User 特定数据重定向或登录Account 时与Team 相关,我无法使用护照记录它们。我需要一些想法或解决方案,也许我可以使用一些护照策略。 PS:把这想象成一种松弛登录系统的工作方式,主帐户(电子邮件)可以容纳多个团队或聊天组,每个团队或聊天组都有特定的详细信息。

【问题讨论】:

  • 您现在使用的是passport-local-mongoose 或类似的吗?
  • 我正在使用本地 statregy(已注册 2 个),但我想将它们与不同的反序列化模型一起使用

标签: node.js express passport.js


【解决方案1】:

如果我正确理解您的需求,我相信您有两个选择 - 注册多个(反)序列化器,或将更多逻辑放入您的(反)序列化实现中。

虽然没有真正记录,但您可以注册 multiple serializedeserialize 函数。如果第一个函数不成功,它应该调用done('pass'); 让执行继续到下一个(反)序列化器,例如。 (请注意,代码示例只是在我脑海中浮现):

passport.deserializeUser((obj, done) => {
  Account.deserialize(obj)
    .then((account) => done(null, account))
    .catch((err) => done('pass'));
});

passport.deserializeUser((obj, done) => {
  User.deserialize(obj).then((user) => done(null, user))
});

您不限于使用您选择的 ORM/ODM 的明显内置(反)序列化。因此,您可以在序列化函数中执行您需要的任何自定义逻辑。例如,序列化时将模型实例ID和类型放入对象中,反序列化时使用。

passport.serializeUser((obj, done) => {
  if (obj instanceof Account) {
    done(null, { id: obj.id, type: 'Account' });
  } else {
    done(null, { id: obj.id, type: 'User' });
  }
});

passport.deserializeUser((obj, done) => {
  if (obj.type === 'Account') {
    Account.get(obj.id).then((account) => done(null, account));
  } else {
    User.get(obj.id).then((user) => done(null, user));
  }
});

【讨论】:

  • 谢谢你启发我,我将在接下来的几天里尝试这个并让你知道,谢谢我认为这可能是答案。
  • 我在使用 passport-local-mongoose 时遇到了同样的问题,有人可以帮忙吗?
猜你喜欢
  • 2016-07-22
  • 2013-02-27
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2015-12-22
相关资源
最近更新 更多