检查用户是否已经登录?

6

如何检查用户是否已经登录?

这样,其他浏览器中的用户无法使用相同的帐户登录。

此外,这是一个好的解决方案吗?还是应该让用户在另一个浏览器中登录,然后注销当前用户并显示消息(您已从其他位置登录),就像Messenger一样?

5个回答

3

在登录时生成一个随机令牌(或使用sessionid),并将其存储在数据库和用户的cookie中。每次访问页面时,请确保用户的令牌与数据库条目匹配。如果两者不匹配,请警告用户他们已经在其他地方登录。

您还可以存储登录时间,这将是分配令牌的时间,并要求在允许另一个用户使用相同ID登录之前等待30分钟。


将会话ID存储在数据库中甚至更好。 - TravisO

3
使用 sessions 是一个很好的方法来做到这一点,也是控制身份验证的常用方法。
流程通常如下:
用户访问网站,调用 session_start()。为该访客设置唯一的会话标识符(即 cookie)。
用户提交登录凭据以登录表单。
验证登录凭据,并将此事实存储在会话数据中,例如 $_SESSION['logged_in'] = true
在用户在站点上的其余时间内,可以检查$_SESSION['logged_in']以查看用户是否已登录。
为了控制用户的登录,您可以简单地在数据库中设置一个字段(users 表格是不错的选择),指示用户的当前会话 ID(使用 session_id() 检索),如果它与您刚收到的 cookie 值不匹配,则立即为该 ID 调用 session_destroy(),并将该用户视为已注销。
使用$_SESSION意味着您不必担心生成自己的令牌,并且可以利用内置的superglobals功能来存储有关用户身份验证状态的信息。
个人而言,对于大多数网站,我会允许用户同时拥有多个活动会话,因为通常没有不允许的好理由,但这显然取决于网站的性质。但是,如上所述存储当前活动会话ID是实现此目的的一种非常简单的方法。

还要记得在登录后生成一个新的会话,如果你只在登录表单的第一页视图上生成会话而不重新生成,那么有可能被利用用户。 - TravisO

1

关于如何检测多个用户,问题的前半部分已经得到了很好的回答,但是如何处理它们我认为还需要一些工作。

首先,如果一个用户正确登录,请让他们进入,不要阻止他们如果他们在其他地方登录。如果你真的不想让用户有两个打开的会话,那么就注销旧的会话或者简单地更新你保存的会话ID,这样你就可以弹出旧的连接。你可以通知用户,但我只会向无效的会话发送消息。如果你向登录的用户发送消息,当你只处理用户切换计算机并忘记注销旧会话的情况时,这将变得很烦人。


0

以上提到的所有解决方案都可以工作,但如果在每个页面访问时都调用数据库并检查会话令牌以查看它是否与分配给用户的相同令牌,则会降低响应时间。我建议使用缓存机制而不是上述解决方案中的数据库。将会话令牌存储到数据库中将为您的数据库添加额外的字段,实际上并不需要。使用开源缓存解决方案,如memcache。


0

你可以创建一个名为userLoginStatus的表,其中包含类似于clockIn time和clockOut time的字段,并在用户登录时将当前时间插入到clockIn中,同时将clockOut留空。只有当用户点击注销按钮时,才会更新clockOut时间。这样,你就可以检查特定用户的当前状态,其中clockOut为空的用户应该是已登录的,因为它只有在用户注销时才会更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接