在passport.js或session中的某处添加用户对象中的额外信息
我想在来自mongodb的用户对象中添加自定义键,这将被passport.js使用,但是我想知道为什么我不能将更多的键添加到该对象中,这里是我的代码。
passport.use(new LocalStrategy( function(username, password, done) { Users.model(false).findOne( {email:username,password:encodePassword(password) }, function(err, user) { if( err ){ // validation failed console.log('Error Occurred'); return done(err); } else if(user != null){ user['customKey'] = "customValue"; // it is not setting console.log(user); return done(null, user); } else { return done(null, false, { message: 'Incorrect username.' }); } }); } )); ///Session handling passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { Users.model(false).findById(id, function(err, user) { done(err, user); }); });
看到另一个问题的答案:
在反序列化函数中,在返回用户之前
passport.deserializeUser(function(id, done) { getUser(id).then(function(user) { user.whatever = 'you like'; return done(null, user); }); });
或者在一个快速的中间件(在路由器之前)。
app.use(function(req, res, next) { if(req.user) req.user.whatever = 'you like'; next(); });
如果您有多个提供者login并且想要向用户对象添加dynamic值。
var customKey = null; //Store user id in session passport.deserializeUser(function (Id, done) { User.findById(Id, function (err, user) { var newUser = user.toObject(); newUser['customKey'] = customKey; done(err, newUser); }); }); //Local login passport.use('local.login', new LocalStrategy({ .... customKey = "isLocal"; .... // Facebook login passport.use('facebook.login', new LocalStrategy({ .... customKey = "isFacebook"; ....
在路由器中访问:
req.user.customKey;
在模板中使用:
// in app.js app.use(function(req, res, next) { res.locals.user = req.user; next(); }); //In hbs template: {{user.customKey}}
希望能帮助你。