0

我使用passportjswithpassport-local策略对项目中的用户进行身份验证。官方serializeUser deserializeUser做法如下:

// serialize and deserialize
passport.serializeUser(function(user, done) {
   done(null, user._id);
});

passport.deserializeUser(function(id, done) {
   User.findById(id, function(err, user){
     done(err, user.toJSON());
 })
});

但由于性能原因,我需要防止查询 User.findById 到我的 MongoDB 数据库,所以我使用以下方法:

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

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

但是现在我想出了以下问题:如果用户更改他们的数据,如姓名、年龄等,我如何在不注销的情况下更新这些数据?

其实我需要passport.serializeUser手动执行一些如何?

4

1 回答 1

0

如果您使用的是数据库会话存储,那么您仍然只是user.toJSON()在每次deserializeUser调用时从数据库中检索整个数据库,您认为您正在避免但实际上并非如此。

如果您没有使用数据库会话存储,那么您可能会将其全部存储在 cookie 或看起来非常不安全的东西中,因为用户对象可能包含密码哈希等敏感信息。

如果您只想将用户存储在内存中,您应该这样做。创建一个保存用户对象的缓存。

var Users = {};

passport.serializeUser(function(user, done) {
    Users[user._id] = user; // store in cache
    done(null, user._id);
});

passport.deserializeUser(function(id, done) {
    if(Users[id]) return done(null, Users[id]); // retrieve from cache
    User.findById(id, function(err, user){
        if(err) return done(err);
        Users[id] = user; // store in cache now if wasn't already found
        done(null, user);
    });
});
于 2015-06-19T18:36:19.797 回答