我使用passportjs
和passport-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
一些方法吗?
答案 0 :(得分: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);
});
});