首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PassportJS MySql:我真的需要在每个deserializeUser上查找数据库吗?

PassportJS MySql:我真的需要在每个deserializeUser上查找数据库吗?
EN

Stack Overflow用户
提问于 2017-09-13 19:54:19
回答 1查看 355关注 0票数 0

我使用koa-passport进行身份验证,凭据存储在mySQL服务器上。每个用户名在数据库表中都有一个唯一的ID。我使用了一个非常简单的方案,在这个方案中,我只使用ID进行序列化和反序列化,而不是使用整个用户对象。

对于身份验证,在数据库中定义了一个存储过程,如果在数据库中找到所提供的凭据,它将返回null或userID (该存储过程同时查看用户名和密码,因此不需要在nodeJS上进行处理)。为了简单起见,请假定下面的代码片段直接给出了值,而没有格式化来自mySQL数据库的结果。)

代码语言:javascript
复制
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);
        })
    })
})))

有没有办法避免在每次反序列化时访问数据库?

EN

回答 1

Stack Overflow用户

发布于 2017-10-03 06:35:05

是的,你可以序列化和存储整个用户对象,而不是它的id。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46196878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档