为啥我应该只用护照序列化用户存储 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章