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 ответ

Да, вы можете сериализовать и хранить весь объект пользователя вместо его идентификатора.

Но я не рекомендую вам делать это, потому что данные в сеансе могут устареть. Гораздо лучше получать его из базы данных при каждом запросе.

Другие вопросы по тегам