Как найти идентификатор сеанса при использовании экспресс / подключения и хранилища сеансов? - PullRequest
24 голосов
/ 15 февраля 2012

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

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

.destroy(sid, callback)

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

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

Ответы [ 4 ]

69 голосов
/ 29 июля 2014

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

17 голосов
/ 28 января 2015

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

Промежуточное программное обеспечение Connect не входит в состав Express с версии 4.

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

  1. Убедитесь, что в вашем package.json есть cookie-parser abd express-session модулей.Если это не добавлено, добавьте их:
npm install express-session --save
npm install cookie-parser --save
Будьте внимательны к порядку, указав их в файле 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
}));
Теперь вы должны использовать req.sessionID и req.session.id.
15 голосов
/ 16 февраля 2012

Сохраните 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}});
       ...
    }
    ...
  }
}
0 голосов
/ 15 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...