Можно ли принудительно обновить сеанс со стороны сервера? - PullRequest
0 голосов
/ 17 мая 2019

У меня есть профили пользователей, созданные по паспорту, которые хранятся в mongodb с помощью connect-mongo. Если я обновляю профиль пользователя для сеанса, мне нужно запустить req.login(), чтобы активировать паспорт для обновления сеанса пользователя в соответствии с новой информацией базы данных. Если я изменяю другого пользователя из своей учетной записи администратора, я не могу запустить эту функцию, есть ли способ обновить его для пользователя или вызвать его обновление при следующей загрузке его сеанса?

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

В итоге мне пришлось делать все вручную:

  1. поиск сессий для одного с соответствующим идентификатором пользователя
  2. загрузить последнюю информацию о пользователе и заменить в сеансе
  3. сохранить новую информацию обратно в базу данных

var mongoose = require ('mongoose'); 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);
            });

        });
    });
};
0 голосов
/ 17 мая 2019

Вы можете передать весь пользовательский объект в хранилище сеансов, что гарантирует, что ваш пользовательский объект всегда будет в курсе самой последней информации.

passport.serializeUser(function(user, cb) { cb(null, user); });
passport.deserializeUser(function(user, cb) { cb(null, user); });
...