为啥我应该只用护照序列化用户存储 user.id? [复制]

Posted

技术标签:

【中文标题】为啥我应该只用护照序列化用户存储 user.id? [复制]【英文标题】:Why should I only store user.id with passport serializeUser? [duplicate]为什么我应该只用护照序列化用户存储 user.id? [复制] 【发布时间】:2019-08-22 00:38:10 【问题描述】:

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

【问题讨论】:

@DanO 之前读过那篇文章并没有更明智,但是现在我也查看了 cmets,有人准确地解释了我在寻找什么。谢谢 【参考方案1】:

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

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

【讨论】:

以上是关于为啥我应该只用护照序列化用户存储 user.id? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当护照js中的序列化和反序列化调用时

如何使用护照调用反序列化用户

nodejs护照身份验证令牌

在社交网络的数据库中存储朋友

laravel 5.3 护照和角度存储访问令牌

laravel passport是否在承载令牌中序列化整个用户对象?