Php 阻止用户登录多台计算机
我需要一种防止用户同时登录多台计算机的方法 目前,当用户登录时,我将userID存储在会话变量中。同时,我想删除具有相同用户ID的所有其他会话。可能吗 编辑: 我没有提到解决方案必须是基于文件的。PHP与web服务对话,不允许直接访问数据库 解决方案: 谢谢你的评论。以下是完成的代码:Php 阻止用户登录多台计算机,php,Php,我需要一种防止用户同时登录多台计算机的方法 目前,当用户登录时,我将userID存储在会话变量中。同时,我想删除具有相同用户ID的所有其他会话。可能吗 编辑: 我没有提到解决方案必须是基于文件的。PHP与web服务对话,不允许直接访问数据库 解决方案: 谢谢你的评论。以下是完成的代码: // When a new session is created file_put_contents(TEMPDIR."session_".$userid, session_id()); // For each
// When a new session is created
file_put_contents(TEMPDIR."session_".$userid, session_id());
// For each request
if (file_exists(TEMPDIR."session_".$userid) == true) {
$session_id = file_get_contents(TEMPDIR."session_".$userid);
if ($session_id != session_id())) {
session_destroy();
}
}
每次用户登录时,您都可以将
session\u id()
写入名为$user\u id.session
的文件。然后,每次在脚本顶部调用session\u start()
时,加载文件的内容,如果$user\u id.session
中包含的id不等于session\u id()
则调用session\u destroy()
来销毁旧会话
或者,您可以(也应该)将相同的信息写入键值存储(KVS),如Redis或Memcached,或者,如果确实必须写入数据库
为清楚起见,我从评论中添加了以下信息: 也就是说,每次登录(在新计算机上)时,您都会向文件中写入一个新的
会话id()
,因此旧会话将过期(如果和当它们尝试重新加载站点时),因为它们不再匹配文件中的会话id()
每次用户登录时,您都可以将session\u id()
写入名为$user\u id.session
的文件。然后,每次在脚本顶部调用session\u start()
时,加载文件的内容,如果$user\u id.session
中包含的id不等于session\u id()
则调用session\u destroy()
来销毁旧会话
或者,您可以(也应该)将相同的信息写入键值存储(KVS),如Redis或Memcached,或者,如果确实必须写入数据库
为清楚起见,我从评论中添加了以下信息:
也就是说,每次登录(在新计算机上)时,您都会向文件中写入一个新的会话id()
,因此旧会话将过期(如果和当它们尝试重新加载站点时),因为它们不再匹配文件中的会话id()
我以前这样做的方法是保存用户上次登录数据库时的会话id。
然后,在身份验证检查中,我查看当前会话ID与数据库中的会话ID是否匹配,如果不匹配,则将其注销(即取消设置成员会话)
但在国际海事组织,这并不是解决这个问题的最佳办法。我认为更好的方法是不允许第二个人登录(这样你就不会打扰第一个人的体验)。当您有两个真正的用户登录并不断地将另一个人注销时,这也会停止问题的出现。我以前这样做的方法是将用户上次登录时的会话id保存在数据库中。
然后,在身份验证检查中,我查看当前会话ID与数据库中的会话ID是否匹配,如果不匹配,则将其注销(即取消设置成员会话)
但在国际海事组织,这并不是解决这个问题的最佳办法。我认为更好的方法是不允许第二个人登录(这样你就不会打扰第一个人的体验)。当您有两个真正的用户登录并不断注销另一个用户时,这也会停止问题的出现。您是否注意到此页面的“相关”部分,其中包含指向同一问题的链接,以前曾被问过十几次?是的,但我没有在相关问题中找到解决方案。您是否注意到此页面的“相关”部分,同一个问题的链接以前被问过十几次?是的,但我在相关问题中没有找到解决方案。这不起作用,因为每台计算机都有不同的会话id。这会很好,如果你将其写入数据库而不是文本文件,效果会更好,因为每次加载一个page@PiTheNumber事实上——这是一个想法——只有最后创建的会话不会被破坏为什么要使用文本文件?使用数据库。a)文本文件比数据库更普遍-Tom没有提到他正在使用数据库,所以我不想假设,b)如果我这样做,我会将其放入一个键值存储,如Redis,c)当每个HTTP请求都需要一个或两个额外的查询时,数据库的扩展性不好,但是文本文件被操作系统很好地缓存,d)还有很多原因。但是,如果您继续进行多前端设置,则需要切换到KVS或DB,或者找到一种同步文件的方法,但这种方法不起作用,因为您为每台计算机获得不同的会话id。这将很好地工作,如果您将其写入数据库而不是文本文件,效果会更好,因为每次加载一个page@PiTheNumber事实上——这是一个想法——只有最后创建的会话不会被破坏为什么要使用文本文件?使用数据库。a)文本文件比数据库更普遍-Tom没有提到他正在使用数据库,所以我不想假设,b)如果我这样做,我会将其放入一个键值存储,如Redis,c)当每个HTTP请求都需要一个或两个额外的查询时,数据库的扩展性不好,但是文本文件被操作系统很好地缓存,d)还有很多原因。但是,如果您继续使用多前端设置,您需要切换到KVS或DB,或者找到一种更好的同步文件的方法?如果第一个人的电脑重新启动了怎么办?你还必须在电脑上设置某种超时,这样如果真的发生了这种情况,那么这个人在设定的时间段后仍然可以登录。曾经代替过这样的人,无法登录吗?不能说我有,但我仍然认为这是一种更好的方式