2017-08-26 12 views
0

私は2つの部分のログインシステムを構築しています。ユーザーがメインアカウントAccountにログインする場合、このアカウントは多くのチームTeamのモデルにアクセスでき、アカウントは1人のユーザーがチームUserの1人のユーザーを持つことができます。問題は、私がAccountログイン戦略をパスポートで定義できることですが、私はAccountモデルを使用してシリアル化と逆シリアル化しかできませんが、のに関連するAccountの特定のデータでリダイレクトまたはログインしたい場合、パスポートを使用してログに記録します。私はいくつかのアイデアや解決策が必要です。おそらくそこにパスポート戦略があります。 PS:これは怠惰なログインシステムのようなものだと思いますが、メインアカウント(電子メール)はそれぞれ複数のチームやチャットグループに対応しています。passport.js複数のde/serializeメソッド

+0

「パスポート - ローカル - モンゴース」などを使用していますか? – vesse

+0

私はローカルstatregy(2登録済み)を使用していますが、異なるde/serializeモデルでそれらを使用したいです –

答えて

1

私があなたの必要性を正しく理解していれば、複数の(デ)シリアライザを登録するか、より多くのロジックをシリアライズ実装に追加する2つのオプションがあると思います。

実際には文書化されていませんが、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

あなたは私に啓発してくれてありがとう、私は今後の日にこれを試してみて、ありがとう、私はこれが潜在的に答えだと思います。 –