用户登录时,我设置
req.session.username = "....";
所以,我们可以知道这个会话有用户名
但是如何检测此用户名是否已从另一台计算机登录并注销(删除会话)另一台计算机
答案 0 :(得分:0)
在服务器上,只需创建一个哈希,其中包含已登录用户列表及其当前使用的会话。将此哈希存储在存储内容的任何位置(SQL DB,NOSQL DB,平面文件,内存DB等)。
登录后,快速查看该列表(伪代码):
if( user in logged in list)
delete the session listed for that user
otherwise
create the session
log session into logged in user list
简单。
答案 1 :(得分:0)
我认为无法确定用户是否从另一台计算机发出请求。您可以使用http标头User-Agent
,但如果两台计算机具有完全相同的用户代理和版本,您仍会看到它们相同。
使用IP更容易出错,因为多个设备可能只使用相同的WIFI路由器或未设置HTTP_FORWARDED_FOR的代理。
然而;如果用户尝试使用已存在的用户名启动新会话(登录),则可以拒绝新会话或destroy the old one。
您需要维护数组或redis中的活动会话列表。
答案 2 :(得分:0)
由于您将在尝试登录时检索用户详细信息,因此可以添加属性loggedIn
,该属性将是Boolean
,在用户架构中的默认值为false。>
现在,您可以在登录中间件中附加一个控制流,以确定用户是否已登录:
/** Check if user is already logged in */
if (user.loggedIn) {
let error = {
status: 401,
message: 'user already logged in. '
+ 'Please request a password reset if you suspect this is not you.'
}
return next(error);
}
// if not, log user in, set the `loggedIn` flag to true and move on.
每当用户注销时,将loggedIn
标志重置为false。