【发布时间】:2014-10-01 17:55:57
【问题描述】:
我希望只允许一个用户实例登录。如果我在这台计算机上登录,然后去另一台计算机登录,之前的会话应该被破坏。我怎样才能做到这一点?如何访问所有会话,以便销毁正确的会话或确保会话的用户 ID 是唯一的?我看到的有关访问会话的唯一文档是 req.session,它仅适用于当前会话。
【问题讨论】:
标签: node.js session express sails.js
我希望只允许一个用户实例登录。如果我在这台计算机上登录,然后去另一台计算机登录,之前的会话应该被破坏。我怎样才能做到这一点?如何访问所有会话,以便销毁正确的会话或确保会话的用户 ID 是唯一的?我看到的有关访问会话的唯一文档是 req.session,它仅适用于当前会话。
【问题讨论】:
标签: node.js session express sails.js
实现这一点的典型方法是将用户的会话 ID 保存在数据库中,并且每当他们登录时,销毁之前存储了 ID 的会话。 Sails 使用Connect's session store 进行会话管理。会话 ID 公开为req.sessionID,底层会话存储公开为req.sessionStore。因此,鉴于 Connect 文档中描述的会话存储接口,您可以在登录操作中执行以下操作:
// Destroy the session from the previous login
req.sessionStore.destroy(loggedInUser.currentSessionId, function(err) {
if (err) {return res.serverError(err);}
// Save the session ID of the current login
User.update({id: loggedInUserId}, {currentSessionId: req.sessionID})
.exec(function(err) {
if (err) {return res.serverError(err);}
// Continue your login action...
});
});
【讨论】:
User.update,从技术上讲,您甚至不必等待就可以继续。 sessionStore.destroy 非常快,因为它使用由会话 ID 索引的哈希。如果您不得不循环遍历所有会话,并且会话数量很多,则可能会降低性能(并且您必须等待它才能继续)。
User.update 而不是loggedInUser.currentSessionId = req.sessionID; loggedInUser.save();?据我所知,User.update 用于更新模型的多个实例,而 save 仅用于一个。