Die*_*ero 0 node.js express passport.js
我正在构建一个由两部分组成的登录系统。如果用户将登录到主帐户Account
模型,该帐户将拥有对多个团队Team
模型的访问权限,并且每个团队User
模型一个帐户可以有 1 个用户。问题是我可以Account
使用护照定义登录策略,但我只能使用Account
模型进行序列化和反序列化,但是当我想Account
使用User
与 a 相关的特定数据重定向或登录时,Team
我无法使用护照记录它们。我需要一些想法或解决方案,也许我可以使用一些护照策略。PS:把这想象成一个slack登录系统的作品,主帐户(电子邮件)可以容纳多个团队或聊天组,每个都有特定的细节。
如果我正确理解您的需求,我相信您有两个选择 - 注册多个(反)序列化器,或者将更多逻辑放入您的(反)序列化实现中。
虽然没有真正记录,但您可以注册多个序列化和反序列化函数。如果第一个函数不成功,它应该调用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))
});
Run Code Online (Sandbox Code Playgroud)
您不仅限于使用您选择的 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));
}
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1191 次 |
最近记录: |