Подтвердить что ты не робот

Как я могу найти идентификатор сеанса при использовании Express/Connect и хранилища сеансов?

Если пользователь уже вошел в систему и снова пытается войти в новый экземпляр, я бы хотел, чтобы он выходил из другого экземпляра пользователя. Я не хочу, чтобы один и тот же пользователь дважды регистрировался в моем приложении.

В настоящее время сеанс хранится в хранилище Redis, я использую express/connect для обработки хранилища сеансов. Одна из доступных функций, которая может быть использована для уничтожения сеанса, следующая:

.destroy(sid, callback)

Однако мне нужно найти этот идентификатор сеанса, прежде чем я вызову .destroy(). В Redis имя пользователя хранится как часть сеанса.

Вопрос: Возможно ли запросить Redis для получения идентификатора сеанса на основе имени пользователя?

4b9b3361

Ответ 1

req.sessionID предоставит вам идентификатор сеанса, где req - это объект запроса.

Ответ 2

Для недавних читателей;

Подключить middlewares не входят в Express с версии 4.

Итак, чтобы иметь req.sessionID работу, вы должны выполнить следующее:

  • Убедитесь, что у вас есть cookie-parser abd express-session модули внутри вашего пакета .json. Если он не добавлен, добавьте их:
npm install express-session --save
npm install cookie-parser --save
  1. Соблюдайте порядок, требуя их в вашем файле app.js и добавляйте необходимые параметры конфигурации.
var cookieParser = require('cookie-parser');
var session = require('express-session')
app.use(cookieParser());
app.use(session({
    secret: '34SDgsdgspxxxxxxxdfsG', // just a long random string
    resave: false,
    saveUninitialized: true
}));
  1. Теперь вы должны использовать req.sessionID и req.session.id.

Ответ 3

Храните SID с учетной записью, когда пользователь входит в систему во время проверки базы данных учетной записи пользователя .destroy(sid, fn), а затем обновляет SID в базе данных с текущим SID пользователя.

В моем случае, используя MongoDB, вот как я это сделал:

app.post('/login', function(req, res)
{
  var sid = req.sessionID;
  var username = req.body.user;
  var password = req.body.pass;

  users.findOne({username : username, password : password}, function(err, result)
  { 
    ...
    sessionStore.destroy(result.session, function(){
       ...
       users.update({_id: result._id}, {$set:{"session" : sid}});
       ...
    }
    ...
  }
}

Ответ 4

Вопрос: Можно ли запросить Redis для получения идентификатора сеанса на основе имени пользователя?

Нет. Клавиши сеанса в redis не называются после имени пользователя.

Вот мысль: если уже зарегистрированный пользователь пытается снова войти в систему, вы не можете увидеть это в своем приложении и либо немедленно уничтожить старый сеанс, либо не разрешить им снова войти?