PassportJS MySql:我真的需要在每个反序列化用户上查找数据库吗?
问题描述:
我正在使用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);
})
})
})))
有没有一种方法,以避免各反序列化访问数据库?
答
是的,你可以序列化和存储整个用户对象,而不是它的ID。
但我不建议你这样做,因为会话中的数据可能会过时。在每个请求中从数据库中获取它要好得多。