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

时间:2013-10-11 08:10:58

标签: node.js authentication passport.js

我想在来自mongodb的用户对象中添加自定义键,这将由passport.js使用,但我想知道为什么我不能为该对象添加更多键,这是我的代码。< / p>

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);
    });
});

2 个答案:

答案 0 :(得分:8)

请参阅another question的答案:

  

在反序列化功能中,在返回用户之前

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();
});

答案 1 :(得分:1)

如果您有多个提供者登录并希望动态值添加到用户对象。

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}}

希望能帮到你。