为什么我应该只使用护照序列化用户存储 user.id ?

Aug*_*and 3 node.js passport-local passport.js

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

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

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

passport.deserializeUser(function(user, done){
   done(null, user);
});
Run Code Online (Sandbox Code Playgroud)

尝试之后,我发现这个方法没有问题,但是因为很多其他人没有存储他们的整个对象,而是只存储 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]);
    });
});
Run Code Online (Sandbox Code Playgroud)

这也有效,但现在我想知道,这样做我得到了什么?仅存储 ID 是否更有效,因为每次我需要访问用户对象时似乎没有必要访问数据库。非常感谢任何澄清:)

Aug*_*and 5

经过更多挖掘后,我发现 Max Truxa 在Understanding Passport Serialize Deserialize上留下的评论回答了我的问题。如果其他人有兴趣,我会将其留在这里。

\n\n
\n

您可以将整个用户对象放入会话数据中,但这通常不是一个好主意,因为它可能会产生其他副作用。例如,当用户更新他/她的用户名时,您也必须更新会话数据,否则您将因为“重命名功能损坏”而收到票证。这是一个相对无害的示例。\n 权限位或同等敏感数据也可能发生同样的情况(哎呀...)。本质上,如果您有重复的数据,您总是会遇到同样的问题。TL;DR - 不要这样做。\xe2\x80\x93 Max Truxa 2016 年 8 月 22 日 at\n 18:30

\n
\n