我已经在一个节点项目上工作了一段时间,并且已经实现了护照处理身份验证。与很多人一样,我对通行证使用的“ 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更有效,因为每次我需要访问我的用户对象时,访问数据库似乎都是不必要的。任何澄清都非常感激:)
答案 0 :(得分:0)
进行更多挖掘之后,我发现Max Truxa在Understanding passport serialize deserialize上留下的评论回答了我的问题。如果其他人有兴趣,我会把它留在这里。
您可以将整个用户对象放入会话数据中,但是 这通常不是一个好主意,因为它可以有另一面 效果。例如,当用户更新他/她的用户名时, 也要更新会话数据,否则您将获得票证,因为 损坏的重命名功能”。那是一个相对无害的例子。 权限位或相等的敏感数据可能发生相同的情况 (糟糕...)。基本上,如果您遇到了同样的问题, 有重复的数据。 TL; DR-不要这样做。 – Max Truxa 16年8月22日在 18:30