2017-09-13 86 views
0

我正在使用koa-passport进行身份验证,凭据存储在mySQL服务器上。每个用户名在数据库表中都有一个唯一的ID。我正在使用一个非常简单的方案,我只是将ID用于序列化和反序列化,而不是具有整个用户对象。PassportJS MySql:我真的需要在每个反序列化用户上查找数据库吗?

对于身份验证,数据库中定义了一个存储过程,如果在数据库中为所提供的凭据(数据库中存储过程同时查看用户名和密码,因此不需要在nodeJS上处理)返回null或userID。此外,假设下面的代码片段直接给了我们不格式化从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。

但我不建议你这样做,因为会话中的数据可能会过时。在每个请求中从数据库中获取它要好得多。

相关问题