提问者:小点点

为什么我只应该用passport SerializeUser存储user.id?[副本]


我已经在一个节点项目上工作了一段时间,并且也实现了passport handle身份验证。与许多人一样,我对passport使用的“serializeUser”和“deserializeUser”函数感到困惑,据我所知,这些函数用于在会话(req.session.passport)中存储用户id,然后在需要时使用该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更有效,因为每次需要访问用户对象时都访问数据库似乎是不合适的。如有任何澄清,不胜感激:)


共1个答案

匿名用户

在做了更多的挖掘之后,我发现了Max Truxa留下的关于理解passport serialize,deserialize的评论,它回答了我的问题。如果还有人感兴趣的话,我就把它留在这里。

您可以将整个用户对象放入会话数据中,但这通常不是一个好主意,因为它可能会产生其他副作用。例如,当用户更新他/她的用户名时,您也必须更新会话数据,否则您将会因为“坏掉的重命名功能”而获得罚单。这是一个相对无害的例子。同样的情况也可能发生在权限位或同等敏感数据(OOPS..。。)上。如果您有重复的数据,基本上您总是会遇到相同的问题。TLDR-别这么做。Max Truxa,2016年8月22日18:30