node + express限制用户异地/多处登陆问题方案

发布于 2022-09-06 11:46:56 字数 599 浏览 45 评论 0

后端:Node + Express框架
前端:Vue框架

实现功能:
限制同一用户在不同浏览器登陆,解释如下:
例如用户A在PcA处以用户名user进行了登陆,用户B在PcB处以用户名user进行登陆时,浏览器提示用户”user已在另一处登陆,是否踢其下线?”
此时,用户B选择是,则用户A提示下线,用户B上线

当前方案:
利用express-session:用户A登陆后,用户名和密码保存于session和cookie中(session做永久化处理,存储于mongo数据库中),用户B登陆时在数据库中查询是否有user用户,如果有则返回是否踢用户A下线的提示,用户B选择是,则后端主动过期用户A的cookie

我的问题:

  1. 限制同一用户在不同浏览器登陆的功能,利用session这个方案是否合理?
  2. 我理解每个浏览器向后端发送请求后,都会形成相应的session保存起来,查询session数据一般是怎样实现的?例如,怎样查询包含”user“的session的”id“
  3. 怎样实现后端主动向前端发起请求?比如用户A未向后端发起请求的情况下,后端直接修改用户A的cookie,使之过期?
  4. 如果方案不合理,还请指点,感谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

℡寂寞咖啡 2022-09-13 11:46:56

楼主的问题

  1. 限制同一用户在不同浏览器登陆的功能,利用session这个方案是否合理?-- 合理
  2. 我理解每个浏览器向后端发送请求后,都会形成相应的session保存起来,查询session数据一般是怎样实现的?例如,怎样查询包含”user“的session的”id“ -- 这个是session store的实现细节,不同的store不一样,一般是存在数据库里(mysql、mongo、redis等)。session id是可以自定义的,只要能跟用户名关联起来就行
  3. 怎样实现后端主动向前端发起请求?比如用户A未向后端发起请求的情况下,后端直接修改用户A的cookie,使之过期? -- 这里在服务端清除session即可,有官方的api store.destroy(sid, callback)

怎么限制同个用户不能多个地方同时登录

实现思路楼主应该是有的,只是实现细节不清楚:

  1. 用户登录,存储session。每个用户的session对应一个id,假设就是用户名。
  2. 用户再次登录,检测当前用户是否已经登录 -> 检测该用户名,是否已经存在session。

楼主不清除的应该是,怎么把 用户名、session id关联起来,包括怎么在有用户名的情况下,查询到该用户名对应的session。

如果用express-session,可以这么实现。

genid选项:生成session id

genid返回的是session对应的id,楼主根据实际情况进行自定义。

app.use(session({
  genid: function (req) {
    return req.query.usrname; // 生成session的id
  }
}));

session检测

用户再次登录,通过session id 去检测session是否存在,以此判断用户是否已登录。

app.use(function (req, res, next) {
  req.sessionStore.get(req.query.usrname, function (error, session) {
    // 如果session存在,表示用户已在其他地方登录
  });
});
不交电费瞎发啥光 2022-09-13 11:46:56

嗯,表示登陆然后呢?怎么班这个时候是不是主动想服务端发送不请求,核心功能不知道scoket.io有没有了解,如果要实现这个功能就要实时监听服务端session id的状态! 我觉得我的提醒可以让你将这篇文章写的更好一些!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文