2017-10-10 12 views
0

で認証します。過去1時間はpassport.jsのログインで複数のモデルを認証する方法を探しています。 私のアプリには2つのモデル、先生と学生があり、先生や生徒であることを確認するログインページを作ってからログインし、app.jsの2つのモデルをシリアライズしてデシリアライズしようとしましたが、どちらが認証するのかわからない、私はこれを行うことができる方法はありますか?複数のモデルをpassport.js

編集: 私は学生と教師の両方のコレクションに、学生用に1、教師用に2つのポジションフィールドを持っています。 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); 
     }); 
     } 
}); 

答えて

0

申し訳ありません申し訳ありませんがコメントを書くのに十分なスコアはありません:)。大きなスニペットがなければ、ハードビットを伝えることですが、あなたが

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

回答ありがとうございますが、私の最後にはうまくいかず、私は質問を更新しました。 –

+0

どのように動作しませんでしたか?あなたの更新を見て、私は検索エンジンでエラーを見ることができます。最後の行は 'done(null、{id:user.id、type:type});' –