为什么我应该只使用护照 serializeUser 存储 user.id?

Why should I only store user.id with passport serializeUser?

我已经在节点项目上工作了一段时间,并且已经实现了护照和处理身份验证。与很多人一样,我对护照使用的 "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 更有效,因为每次我需要访问我的用户对象时访问数据库似乎是不必要的。非常感谢任何澄清:)

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

You could put the whole user object into the session data, but that is usually not a good idea because it can have other side effects. For example, when the user updates his/her username you have to update the session data too, otherwise you'll get tickets because of "the broken rename feature". That's a relatively harmless example. Same could happen with permission bits or equal sensitive data (Oops...). Essentially the same problems you always run into if you have duplicate data. TL;DR - Don't do it. – Max Truxa Aug 22 '16 at 18:30