PassportJS MySql: мне действительно нужно искать базу данных на каждом deserializeUser?
Я использую коа-паспорт для аутентификации и учетные данные хранятся на сервере MySQL. Каждое имя пользователя имеет уникальный идентификатор в таблице базы данных. Я использую очень простую схему, где я использую идентификаторы для сериализации и десериализации вместо целого пользовательского объекта.
Для аутентификации в базе данных определена хранимая процедура, которая возвращает либо ноль, либо идентификатор пользователя, если найдена в базе данных для предоставленных учетных данных (хранимая процедура просматривает как имя пользователя, так и пароль, поэтому не нужно обрабатывать на 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 ответ
Да, вы можете сериализовать и хранить весь объект пользователя вместо его идентификатора.
Но я не рекомендую вам делать это, потому что данные в сеансе могут устареть. Гораздо лучше получать его из базы данных при каждом запросе.