php - PHP 7.4 防止不同用户登录同一个浏览器
问题描述
我第一次在这里发帖。
我已经建立了一个登录系统(具有密码验证、强度、对数据库的检查、散列等)并且几乎完成了。我已经到了可以防止同一用户重复登录的地方,检查在登录过程中创建的数据库中的两个字段:一个是“token”中随机生成的令牌,另一个是“isSignedIn” a 0 和 1。目前,它可以防止同一用户重复登录,并且还会在下一页操作中启动该人。
我的下一个目标是防止两个不同的用户同时在同一台计算机上登录到同一个 Web 浏览器。经过数小时的搜索,我还没有找到可靠的答案。
这是我遇到的问题:在我的测试过程中,在同一个浏览器中使用多个用户登录:
我用三个不同的用户登录到我的门户;所有三个都
将他们的“令牌”和“isSignedIn”写入数据库我与一个用户注销,该用户的令牌/isSignedIn 值
分别被删除/更改- 当我注销其他两个用户时,即使他们成功注销,他们的 'token' 和 'isSignedIn' 的值仍保留在数据库中。
我不明白为什么注销一个用户会阻止其他两个用户在注销时删除他们的“令牌”和“isSignedIn”。它适用于第一个用户,没问题。我假设有某种会话重叠会杀死另外两个。我不能简单地告诉客户“在一个浏览器上的一台计算机上一次只有一个人”,所以我需要一些帮助。
我想一次只限制一个用户使用一个浏览器,或者阻止第二个/第三个/第四个用户登录同一个浏览器。
任何帮助将不胜感激!
谢谢你。
数据库映像
注销处理器
解决方案
- 请注意,会话在同一浏览器的所有选项卡之间共享。
- 当您在第一个用户注销后取消设置并销毁会话时,$_SESSION['email'] 的值会从其他选项卡中丢失。
- 当您执行 SQL 语句删除登录时,它会失败,如下所示: update ... WHERE email = ''
为了防止多个用户登录到同一个浏览器,用户会话变量就像你使用的那个(isSignedIn)并检查它以将用户从登录页面重定向到主页。将以下代码放在登录页面的顶部:
并在注销操作中添加: $isSignedIn = 0;
推荐阅读
- angular - 如何以角度获取数组数组中的值?
- node.js - 如何正确使用 NodeJS 和 Puppeteer 将 SPA 的整页打印为 pdf?
- python - 用于绘制图表演变的 Python 脚本,例如 Paraview
- excel - VBA TextBox.Text 值未正确写入电子表格
- php - 为什么子类不能继承动态设置的属性类?
- jquery - Mongo - 仅通过 _id (findById) 查找是否比使用 _id 和索引字段查找以利用索引更快?
- asp.net-mvc - 在区域管理员视图 ASP.NET MVC 中获取内容文件夹图像
- java - Spring AOP 关闭 Spring Security Annotations
- instagram - 通过脚本在 Spark AR 上补间颜色
- python - 如何获得 BeautifulSoup 对象的唯一 css 选择器?