我在我的脚本中实现了一个 php 登录系统。如果数据库中存在现有会话,我将如何制作拒绝用户登录的脚本?
例如,
用户 1 登录系统 > 接受登录 用户 2 使用与用户 1 相同的帐户登录系统 > 拒绝,因为存在另一个会话。
这就是我希望它工作的方式。
谢谢。
将您的 sessionId 存储在您的数据库中,然后如果上次访问时间是最近的,则拒绝具有不同 sessionID 的用户的登录尝试(通过查找上次登录时间与当前时间之间的差异来计算)。注销时清除 ID
为了那个原因
您必须将session
值存储在数据库中。然后当其他用户使用相同的详细信息登录时。您可以从数据库中检查已经有一个用户在线使用相同的登录详细信息
我会将另一个字段放入名为 last_seen 的数据库中。每次登录用户产生请求 - 只需将当前日期放入该字段。
当有人尝试登录时 - 只需检查多久以前在网站上看到用户。如果超过会话超时时间(默认为 20 分钟) - 您可能会认为用户已注销并允许登录。
否则 - 拒绝登录。
您无法确定用户是否仍在使用您的网站。当用户登录/注销时,您可以在某些字段中输入 1/0,但没有人可以保证用户在关闭选项卡之前会单击注销链接。
但是,当用户单击注销链接时,您可以通过将该新字段设置为 null 来改善您网站的行为。否则可能会发生有人注销并现在尝试再次登录,但由于系统仍将他的帐户视为正在使用而无法这样做。
在您的用户表中应该有一个名为logged_in 的新字段。验证时检查此字段它具有什么值。
如果为 0 / false,则让用户登录并将 logged_in 字段设置为 1/true。
否则,如果 logged_in 字段为 1/true,则不要让第二个用户登录。
注销时不要忘记将 logged_in 字段设置为 0/false。
好问题。
如果您指的是 PHP 会话:您可以将会话 ID(和上次访问时间)存储在数据库中,如果上次访问时间太近(例如,在过去 20 内),则拒绝具有不同会话 ID 的用户的登录尝试分钟)。当然,在注销时清除 ID。
但是请注意,如果用户在没有注销的情况下关闭浏览器然后重新打开它,他们很可能会被锁定一段时间(上面的 20 分钟,或您决定的任何时间间隔),因为他们不会有匹配的会话饼干了。
如果您指的是数据库会话:您必须像在此链接Setting Account Resource Limits
中一样在您的 Mysql DB 中配置。但这里的问题是,一个帐户与服务器的同时连接数仅在 MySQL 5.0.3 中可用。
如果您指的是实时检查,那么您可以使用COMET 编程将数据推送到浏览器,而无需浏览器明确请求它。