2017-08-26 95 views
0

我正在构建2部分登录系统。凡一个用户将登录到一个主账号Account模式,这个账号将持有访问许多球队Team模式,并且一个账号可以有1个用户每队User模式。问题是我可以用护照定义Account登录策略,但我只能使用Account模型序列化和反序列化,但是当我想要重定向或登录Account及其与Team相关的特定数据时,我无法用护照记录他们。我需要一些想法或解决方案,也许有一些我可以使用的护照策略。 PS:认为这就像一个懒散的登录系统类型的作品,主帐户(电子邮件)可以容纳多个团队或每个具有特定细节的聊天组。passport.js多个de /序列化方法

+0

您现在正在使用'passport-local-mongoose'或类似的吗? – vesse

+0

我使用本地statregy(2注册),但我想用它们与不同的de /序列化模型 –

回答

1

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

虽然没有真正记录,但您可以注册multiple serializedeserialize函数。如果第一个函数不成功,它应该调用done('pass');将执行继续到下一个(de)串行器,例如。 (请注意,示例代码只是把我的头顶部):

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)); 
    } 
}); 
+0

谢谢你,只是启发我,我会尝试在未来几天的过程中,让你知道,谢谢我认为这可能是答案。 –