在passport.js或会话中的某处添加用户对象的额外信息

17

我想在从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);
    });
});

我通过一些调试得到了答案。问题是,当mongoose返回一个文档时,它并不像一个简单的json对象那样简单,它有一些由mongoose.js或者可能是mongodb本身设置的属性。所以自定义键成功地添加到了该对象中(您可以通过console.log(Object.keys(user))来检查),但它没有出现在mongoose.js显示模式式的属性正确位置上。 - Taimoor
你能把你的答案和代码一起发布吗?^_^ - Su4p
你解决了吗?我在sequelize中也遇到了同样的问题。我可以删除属性(比如密码),但无法添加属性。编辑:结果发现user.dataValues.hi = 'hi'; 在sequelize中有效。对于其他ORM可能会有所不同。以前从未见过这样的行为。为什么user.password = undefined可以工作,但user.hi = 'hi'却不行呢?它甚至在技术上都没有一个.password字段,它被删除了,是.dataValues.password字段。 - Spencer
2个回答

10

请参考另一个问题的答案:

要么在反序列化函数中,在返回用户之前进行以下操作:

passport.deserializeUser(function(id, done) {
    getUser(id).then(function(user) {
        user.whatever = 'you like';
        return done(null, user);
    });
});

或者在 Express 中间件中(在路由器之前)。

app.use(function(req, res, next) {
    if(req.user) req.user.whatever = 'you like';
    next();
});

我建议使用中间件路由,我使用这样的函数将最后访问日期时间添加到req.session中,并且还在使用app.all('*')开发中间件来进行IP请求跟踪。 - Isaac
在序列化函数中使用它是否合适? - Nima

2
如果您有多个提供商登录,并想要将动态值添加到用户对象中。
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}}

希望能够帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接