2017-09-13 1 views
0

私は認証にkoa-passportを使用しており、資格はmySQLサーバーに保存されています。各ユーザ名はデータベーステーブルに一意のIDを持っています。私はシンプルなスキームを使用しています。シンプルなスキームでは、ユーザー全体のオブジェクトを持つ代わりに、シリアライゼーションとデシリアライゼーションの両方にIDを使用しています。PassportJS MySql:すべてのdeserializeUserでデータベースを参照する必要がありますか?

認証には、データベースに定義されたストアドプロシージャがあります。このプロシージャは、提供された資格情報のデータベースにnullまたはuserIDを返します(ストアドプロシージャはユーザー名とパスワードの両方を調べ、nodeJSを処理する必要はありません)。以下のコードは、直接簡略化のため)用のMySQLデータベースからの結果をフォーマットせずに私たちに値を与えていると仮定してください

const localStrategy = require('passport-local').Strategy; 
passport.serializeUser((ctx, ID, done) => { 
    done(null, ID); 
}); 

passport.deserializeUser(async (ctx, ID, done) => { 
    mySQLPool.getConnection(function (err, thisConnection) { 
     let sqlQuery = "select * from table where userID = " + ID + ""; 
     thisConnection.query(sqlQuery, function (error, results) { 
      thisConnection.release(); 
      console.log("De-serializing User"); 
      done(error, results.userID); 
     }) 
    }) 
}); 

passport.use(new localStrategy({ 
    usernameField: 'username', 
    passwordField: 'password', 
    passReqToCallback: true 
}, (async function (ctx, username, password, done) { 
    mySQLPool.getConnection(function (err, thisConnection) { 
     let sqlQuery = "CALL " + leadingSQLStoredProc + username + "', '" + password + trailingSQLStoredProc; 
     console.log("Authenticating user....") 
     thisConnection.query(sqlQuery, function (error, results) { 
      thisConnection.release(); 
      if (error) 
       return done(error); 
      if (results.userID !== null) 
       return done(null, results.userID); 
      else 
       return done(null, false); 
     }) 
    }) 
}))) 

各デシリアライゼーションの上のデータベースにアクセスしないようにする方法はあり ?

答えて

1

はい、IDの代わりにユーザーオブジェクト全体をシリアル化して保存することができます。

ただし、セッション内のデータが廃止される可能性があるため、この方法はお勧めできません。すべての要求に対してデータベースからフェッチする方がはるかに優れています。

関連する問題