2017-09-13 3 views
0

J'utilise koa-passport pour l'authentification et les informations d'identification sont stockées sur un serveur mySQL. Chaque nom d'utilisateur a un identifiant unique dans la table de base de données. J'utilise un schéma très simple où j'utilise simplement des ID pour la sérialisation et la désérialisation au lieu d'avoir un objet utilisateur entier. Pour l'authentification, une procédure stockée est définie dans la base de données qui renvoie null ou l'ID utilisateur si elle est trouvée dans la base de données pour les informations d'identification fournies (la procédure stockée utilise à la fois le nom d'utilisateur et le mot de passe). S'il vous plaît supposons que l'extrait de code ci-dessous nous donne directement les valeurs sans mise en forme des résultats de la base de données mySQL par souci de simplicité)PassportJS MySql: ai-je vraiment besoin de rechercher la base de données sur chaque deserializeUser?

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

y at-il un moyen d'éviter l'accès à la base de données sur chaque désérialisation?

Répondre

1

Oui, vous pouvez sérialiser et stocker l'intégralité de l'objet utilisateur au lieu de son identifiant.

Mais je ne vous recommande pas de le faire car les données de la session peuvent devenir obsolètes. Il est préférable de l'extraire de la base de données à chaque requête.