express-session如何知道用户已经从另一台计算机登录

时间:2018-02-19 03:27:34

标签: javascript node.js express express-session

用户登录时,我设置

req.session.username = "....";

所以,我们可以知道这个会话有用户名

但是如何检测此用户名是否已从另一台计算机登录并注销(删除会话)另一台计算机

3 个答案:

答案 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。