0

我有通过护照创建的用户配置文件,这些配置文件通过 connect-mongo 存储在 mongodb 中。如果我更新会话的用户配置文件,我必须运行req.login()以触发护照以更新用户会话以匹配新的数据库信息。如果我从我的管理员帐户更改另一个用户,我将无法运行此功能,有没有办法可以为用户更新它,或者在下次加载会话时触发它更新?

4

2 回答 2

0

您可以将整个用户对象传递给会话存储,这将确保您的用户对象始终与最新信息保持同步。

passport.serializeUser(function(user, cb) { cb(null, user); });
passport.deserializeUser(function(user, cb) { cb(null, user); });
于 2019-05-17T18:10:26.977 回答
0

我最终不得不手动完成所有操作:

  1. 搜索具有匹配用户 ID 的会话
  2. 加载最新的用户信息并在会话中替换
  3. 将新信息保存回数据库

var 猫鼬 = 要求('猫鼬');var Schema = mongoose.Schema;

const SessionSchema = new Schema({_id: String}, { strict: false });
const Session = mongoose.model('sessions', SessionSchema, 'sessions');

var User = require('../queries/single.js');

module.exports = function (userId, callback) {

    console.log('finding session for',userId);

    Session.findOne({session: {$regex: userId}},null,{lean: true},(err, session)=>{
        if (err) return callback(err);
        if (!session) return callback('user session not found');

        //parse session
        var sessionJson = JSON.parse(session.session);

        //add reset flag
        sessionJson.passport.user.resetSession = true;

        //get updated user info
        User({_id: sessionJson.passport.user._id}, (err, updatedUser)=>{
            if (err) return callback(err);

            //add new user info to session json
            sessionJson.passport.user = updatedUser;

            //save back to session
            Session.findOneAndUpdate({_id: session._id},{$set: {session: JSON.stringify(sessionJson)}}, (err, savedSession) => {
                if (err) return callback(err);

                //success
                return callback(null);
            });

        });
    });
};
于 2019-06-06T19:04:22.377 回答