为什么我应该只将user.id与护照serializeUser存储在一起?

时间:2019-03-31 20:18:09

标签: node.js passport.js passport-local

我已经在一个节点项目上工作了一段时间,并且已经实现了护照处理身份验证。与很多人一样,我对通行证使用的“ serializeUser”和“ deserializeUser”功能感到困惑,据我了解,这些功能用于将用户ID存储在会话中(req.session.passport),然后在需要时使用该ID从数据库中提取整个对象。我不明白的是为什么您不能仅将整个对象存储在会话中?

我读了一个教程,其中这些功能的实现如下:

passport.serializeUser(function(user, done){
    done(null, user);
});

passport.deserializeUser(function(user, done){
   done(null, user);
});

尝试之后,我发现此方法没有问题,但是由于许多其他人没有存储他们的整个对象,而是只将id切换到相同的方法,现在代码看起来像这样:

passport.serializeUser(function(user, done){
    done(null, user.accountID);
});

passport.deserializeUser(function(id, done){
    connection.query("SELECT * FROM accounts WHERE accountID = ?", [id], function (err, rows){
        done(err, rows[0]);
    });
});

这也可行,但是现在我想知道,通过这样的事情我能获得什么?仅存储ID更有效,因为每次我需要访问我的用户对象时,访问数据库似乎都是不必要的。任何澄清都非常感激:)

1 个答案:

答案 0 :(得分:0)

进行更多挖掘之后,我发现Max Truxa在Understanding passport serialize deserialize上留下的评论回答了我的问题。如果其他人有兴趣,我会把它留在这里。

  

您可以将整个用户对象放入会话数据中,但是   这通常不是一个好主意,因为它可以有另一面   效果。例如,当用户更新他/她的用户名时,   也要更新会话数据,否则您将获得票证,因为   损坏的重命名功能”。那是一个相对无害的例子。   权限位或相等的敏感数据可能发生相同的情况   (糟糕...)。基本上,如果您遇到了同样的问题,   有重复的数据。 TL; DR-不要这样做。 – Max Truxa 16年8月22日在   18:30