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

Работа с сеансами в Express.js

Мне нужна помощь в понимании концепции сеансов для веб-приложения. Я запускаю сервер Node.js с Express 3.0.

Мои цели состоят в следующем:

  • Создайте сеанс для каждого пользователя, который входит в систему

  • Сохраните этот сеанс и используйте его для проверки того, был ли пользователь уже зарегистрирован (запретить одновременное использование двух устройств одним и тем же пользователем) и ограничить доступ к определенным страницам (путем сопоставления идентификатора сеанса с некоторыми другими данными )

Я буду использовать MemoryStore для сохранения сеансов (кажется, проще всего). Если вышеуказанные цели имеют смысл, вы можете дать подробное объяснение того, как их достичь?

4b9b3361

Ответ 1

Экспресс имеет хороший examples в реестре github. Один из них связан с аутентификацией и показывает, как присоединить пользователя к объекту req.session. Это делается внутри маршрута app.post('/login').

Чтобы ограничить доступ к определенным страницам, добавьте простую промежуточную ссылку в эти маршруты.

function restrict(req, res, next) {
  if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
  }
}

app.get('/restricted', restrict, function(req, res){
  res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>');
});

Как уже упоминалось Brandon, вы не должны использовать MemoryStore в процессе производства. Redis - хорошая альтернатива. Используйте connect-redis для доступа к db. Пример config выглядит так:

var RedisStore = require('connect-redis')(express);

// add this to your app.configure
app.use(express.session({
  secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig",
  store: new RedisStore({ host: 'localhost', port: 3000, client: redis })
}));

Ответ 2

Используйте MemoryStore в экспресс ТОЛЬКО, если вы не создаете несколько экземпляров (например, с помощью модуля кластера). Если вы выполняете балансировку нагрузки между машинами, ваш балансировщик нагрузки должен будет использовать липкие/постоянные сеансы.

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

req.session.loggedIn = true;

Если вы хотите проверить, вошел ли пользователь в систему, просто проверьте эту переменную.

if (req.session.loggedIn) {
    // user is logged in.
}
else {
    // user is not logged in.
}

Вы упомянули о том, что один пользователь не может проводить сеансы более одного сеанса за раз. Для этого вам может потребоваться сохранить что-то в базе данных, указывающую, что пользователь вошел в систему. Предупреждаю, это может быть опасно из-за устаревших сеансов. Например, что делать, если пользователь входит в систему, но никогда не выходит из системы? Что делать, если они закрывают окно браузера, поэтому сеанс ушел навсегда?

Экспресс не имеет понятия истечения срока действия бездействия. Я реализовал такую ​​вещь, сохранив все сеансы в базе данных вместе с последней доступной меткой времени, а затем периодически очищаю данные сеанса на основе времени. Но тогда вам нужно также обновить свой список тех, кто входит в систему.