Работа с сеансами в Express.js
Мне нужна помощь в понимании концепции сеансов для веб-приложения. Я запускаю сервер Node.js с Express 3.0.
Мои цели состоят в следующем:
-
Создайте сеанс для каждого пользователя, который входит в систему
-
Сохраните этот сеанс и используйте его для проверки того, был ли пользователь уже зарегистрирован (запретить одновременное использование двух устройств одним и тем же пользователем) и ограничить доступ к определенным страницам (путем сопоставления идентификатора сеанса с некоторыми другими данными )
Я буду использовать MemoryStore для сохранения сеансов (кажется, проще всего). Если вышеуказанные цели имеют смысл, вы можете дать подробное объяснение того, как их достичь?
Ответы
Ответ 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.
}
Вы упомянули о том, что один пользователь не может проводить сеансы более одного сеанса за раз. Для этого вам может потребоваться сохранить что-то в базе данных, указывающую, что пользователь вошел в систему. Предупреждаю, это может быть опасно из-за устаревших сеансов. Например, что делать, если пользователь входит в систему, но никогда не выходит из системы? Что делать, если они закрывают окно браузера, поэтому сеанс ушел навсегда?
Экспресс не имеет понятия истечения срока действия бездействия. Я реализовал такую вещь, сохранив все сеансы в базе данных вместе с последней доступной меткой времени, а затем периодически очищаю данные сеанса на основе времени. Но тогда вам нужно также обновить свой список тех, кто входит в систему.