PHP - 停止并发用户登录

Posted

技术标签:

【中文标题】PHP - 停止并发用户登录【英文标题】:PHP - Stop Concurrent User Logins 【发布时间】:2011-09-01 20:21:01 【问题描述】:

我需要一种使用 php/mysql 停止并发登录的方法。

当前设置

目前,在我工作的内部构建的系统上,有 2 个人共享相同的登录名。由于系统的性质,我不希望他们都登录。

我的尝试

大约 10 篇关于 *** 的文章,并尽可能长时间地在 Google 上搜索。

我还尝试在用户表中添加一个“登录”字段,该字段在登录时设置为 1,在注销时设置为 0。然后,如果在登录时使用相同的用户凭据,它将失败。

我遇到的问题是,如果登录的人在没有正确注销的情况下关闭了浏览器,它就没有更新数据库。然后我接到那个人的电话,我必须在数据库中将值重置为 0。

这是不可行的,因为该产品很快就会在内部向大约 20 人推出。

我需要什么

我需要找到一种方法,在浏览器关闭时执行脚本以更新数据库。或者,一种读取服务器上每个当前会话的方式,我可以对其进行操作,或者其他方式。

限制

我们的托管服务提供商很糟糕,因此我可以对服务器进行的更改是有限的/不可能的。托管是一种共享托管解决方案。

【问题讨论】:

更改密码。但如果 x 告诉 y 新密码也没关系。 【参考方案1】:

我需要找到一种方法,在浏览器关闭时执行脚本以更新数据库。

你不能。

您最好的解决方案可能是将会话 ID 与数据库中的用户相关联。如果用户计算机上的会话 ID 与数据库中最新的会话 ID 不匹配,请让他们登录并更新数据库。

【讨论】:

这可能是确保您为每个用户保留一次登录的唯一方法。登录时,将与用户的会话存储在数据库中。之后,您只需验证与用户帐户的会话是否与尝试加载页面的用户的会话相匹配。如果不匹配,请将其注销并强制重新登录。 我确定你俩都是对的,但我就是无法理解你所说的话,这在我的脑海中没有意义。 用户 1 以“用户”身份登录并获得会话 ID“ABC”。您将“ABC”保存到“用户”行中的数据库中。用户 2 以“用户”身份登录并获得会话 ID“DEF”。您将“DEF”保存到数据库中。下次用户 1 执行任何操作时,您的脚本会发现“ABC”不再是“用户”的正确会话 ID,并将其注销。 好吧,这是有道理的。但问题在于该应用程序用于创建电子邮件。现在,虽然应用程序每 5 秒自动保存一次,但它仍然会惹恼曾经登录过的人,因为他们已经被注销了。然后我把它放在脖子上。 @ceejayoz @Jonathon Kuhn 那么正确的回答应该是“停止共享用户名”。【参考方案2】:

也许你应该把它翻过来。

尝试登录的人获得了一个新会话,新会话使相同用户名的任何旧会话无效(从而将它们注销)

这样一次只能有一个人登录。

【讨论】:

同意。这是理想的方式。【参考方案3】:

根据 HTTP 的本质,没有万无一失的方法可以做到这一点。但如果你能处理一些滞后时间,那就有办法了。

你能做的最好的事情就是让一个 JS 脚本在你的服务器上命中一个“keep-alive”脚本。每 30 秒左右执行一次。如果您的服务器在 1 分钟内没有收到客户端的消息,请关闭会话。

【讨论】:

如果每个用户只获得一个会话就可以了...我曾假设他会以这种方式设置他的帐户系统,但这可能是一个错误的假设。谢谢。【参考方案4】:

您可以使用“loggedin”字段,但添加另一个字段“loggedin_timestamp”。然后检查用户最后一次登录的时间。

如果大于会话持久时间,你让他自动重新登录

【讨论】:

【参考方案5】:

我一直在使用 jquery 延迟超时会话脚本来自动注销它们。该脚本将回调一个 php 脚本,我们可以通过该脚本更改数据库会话的时间戳。所以,我认为这个链接会对你有所帮助。 Jquery idle time out

【讨论】:

以上是关于PHP - 停止并发用户登录的主要内容,如果未能解决你的问题,请参考以下文章

firebase 登录用户是不是被视为并发用户?

如何让 Google 停止在 PassportJS 中自动登录用户?

关于每个并发用户去取不同参数值登录问题的记录

spring mvc中的并发用户登录

利用init_connect参数记录用户登录信息

利用init_connect参数记录用户登录信息