0

我创建了一个登录到我的网站。用户登录后,我将用户 ID 和操作(=登录)存储在数据库中,并且 $_SESSION['loggedin']==TRUE。(如果注销数据库中的操作将注销并且会话将被破坏)如果有人想从第二台计算机使用相同的用户名再次登录,我将不允许它,因为数据库中的最后一行是“登录”并且当然,用户 ID 也将相同。所以我不想允许来自一个用户名的多个连接。现在在这里我想放一个链接:“断开其他连接”。

例如:我在学校登录但忘记注销,然后我尝试在家登录但它会失败,因为我在另一个地方登录(会话处于活动状态)所以如果我点击“断开其他连接”链接我想要删除学校中的会话值(更改数据库中的操作值是不够的,因为如果我将其更改为注销会话仍然存在并且多个连接将可用)

如何防止来自一个用户名的多个连接?

4

2 回答 2

1

听起来你需要做的是保存一些东西来识别个人连接,比如说一个你每次登录帐户时都会增加一个的数字。

例如,假设您使用 ID 为 1 的用户登录,这是您第五次登录,因此您将其保存到 DB: UserID=1, State="Logged In", ConnectionID=5 到您保存的会话: $_SESSION['loggedin']=TRUE 和 $_SESSION['ConnectionID']=5

下次登录时,检查是否存在尚未注销的帐户的连接,如果是这种情况,您可以更新现有行以将状态设置为已注销,或者如果您想记录时间创建状态为已注销的新条目(UserID=1,State="Logged Out",ConnectionID=5),当然您还为新连接插入一行,连接 6。

之后,您所需要做的就是在您的网站上运行代码,可能每次加载页面时,您都会检查数据库中是否有任何行与您保存在 $_SESSION 中的 ConnectionID 相同,以及它们是否有设置为已注销的操作,如果是这种情况,您会破坏将注销先前连接的会话。

希望这能让您很好地了解如何做到这一点。我敢肯定还有其他选择。

如果您只关心一个帐户仅从一个地方登录,并且您对他们注销时的登录不感兴趣,您可以将 UserID 和 ConnectionID 保存到数据库中,然后检查数据库中的 ConnectionID与Session中的相同,如果不是,则终止该会话。

于 2012-10-28T16:23:52.547 回答
0

唯一不太可靠的方法是检查 IP 地址,当用户位于 NAT 网关(例如蜂窝数据连接、家庭路由器等)后面时,这种方法会严重失败。如果用户再次通过登录序列并且之前打开的会话正在进行,则最好的选择是简单地删除任何现有会话。类似的东西

登录.php:

<?

check_password_stuff();

if (user_is_already_logged_in()) {
   delete_login();
}
do_login_stuff();
于 2012-10-28T16:20:40.903 回答