0

我有一个由不同用户使用的网络应用程序。我需要做的是避免同一个用户在不同的浏览器或系统中登录。有人可以帮忙吗???提前谢谢。

4

4 回答 4

1

很多答案(即“已登录标志”)都有一个很大的问题!如果浏览器出现问题怎么办?(机器被格式化,缓存/cookies被清除,等等)然后你有一个服务器认为已经登录的用户,但就用户而言……并且无法登录在。您必须添加一个超时,并监视每个请求(以重置超时)。

我建议您每次登录时向用户颁发新凭据。颁发新凭据的行为会使以前的凭据无效。最简单的方法是创建一个(随机)令牌并将该令牌保存到 cookie 和数据库行中。根据数据库值检查 cookie 并确保它是最新的。

请注意,这与其他答案相反(我不清楚这是否与您的意图相反) - 不会阻止用户再次登录,但他之前的登录被禁用。

编辑:

我在伪代码中所说的:

//to authenticate user
if ($user = sql('select * from users where id = ' . intval($_COOKIE['user_id']) && $_COOKIE['token'] == $user['token']) {
    //user is authenticated. the token in their cookie is the same as the token in the db
} else {
    //user is not authenticated. 
}

//to log user in
if ($user = sql('select * from users where  = ' . intval($_REQUEST['user_id']) && $user['password'] == $_REQUEST['password']) {
    //user is authenticated and can be logged in now. the user id they passed and password match (though you'll probably be accepting email address and hasing the password...).
    $token = rand();
    setcookie('user_id', $user['user_id']);
    setcookie('token', $token);
    sql('update users set token = '$token' where user_id = ' . $user['user_id']);
    //now the token in the db has been updated, and only the user that just logged in has it. other instances of this users login don't have it, so can't authenticate
} else {
    //user is not authenticated and can't be logged in
}

尽管该代码比伪代码更像 PHP,但它并不意味着按原样运行。您需要为您的数据库库、表模式进行自定义,确保安全(通过在密码上使用 md5() 等)。我只是想说明这个概念。

编辑:如上所述,这种方法的目的是允许用户再次登录,但使他们以前的登录无效。(这与不允许用户第二次登录相反。)无论哪种方式,用户只登录一次——问题是您允许第一次还是最后一次。但是,从您现在的评论来看,这似乎不是您(认为)您想要的。

试图阻止用户第二次登录充满了陷阱。从最简单的设置开始,用户登录,您在数据库中设置一个“isLoggedIn”值,然后在清除该值之前不要让他们再次登录(可能来自您的 logout.php)。(这是其他人的建议——继续并标记他们的答案之一。)如果他们无法注销,您会怎么做?如果他们从桌面登录,然后需要从办公室登录?

您是否禁止他们登录?或者,也许您的礼物是“您确定要登录”消息,并允许他们覆盖之前的登录。如果是这样,您需要一种方法来使之前的登录无效。所以你回到我的象征性建议。(在这种情况下,使用 db 中存在的令牌来表示他们仍然登录到以前的会话(相当于 isLoggedIn),并在他们注销时将其清除。)

是否仍要阻止第二次登录?那么你不能依赖你的用户主动注销。如果他们在办公室怎么办?或者他们从手机登录然后丢失了手机?或者清除他们的cookies。您将不得不依靠超时。不要太长或者用户到办公室时无法登录,也不要太短或者用户每次喝咖啡都必须登录。(会话 cookie 可能对她有帮助,但你不能依赖它们,因为很多人会打开浏览器窗口好几天。)

在这种情况下,每次他们在登录时点击页面时,您都会更新数据库中的 lastActivity。然后检查 lastActivity >= now() - x 分钟。如果没有,那么您将它们注销。当他们尝试登录时,您必须做同样的事情。如果 lastActivity >= now() - x 分钟,您告诉他们他们无法登录。

(你可以依赖 PHP 会话,但我不得不承认我没有足够的经验来配置这些来推荐任何东西。我寻找了一个处理程序以在会话到期时插入,但我没有找到任何看起来很简单的东西,可能是因为会话可能在下一次调用 PHP 页面前几天过期。)

于 2012-12-26T07:08:07.420 回答
0

您可以在 mysql 表中有一个标志,例如login_staus. 设置为1如果用户登录,否则设置为0。根据标志,您可以做进一步的事情。这也不是唯一的方法,请与其他人核实。

于 2012-12-26T07:01:45.503 回答
0

好吧,您可以在具有用户的表中添加一个标志(字段)。
当用户登录时,设置标志。即设为1。
在允许任何用户登录之前,只需检查标志是1还是0。仅当相应标志为0时才允许用户登录。

于 2012-12-26T07:03:25.633 回答
0

我会通过mysql

经过

creating a filed in user table wtih column logged_in

when user logs in update that to 1 

 when he logs outs set it to 0

并且当用户登录时只需检查logged_in的值是否存在

这只是一个想法,我认为它可以在没有任何 cookie 或会话问题的情况下工作

因为您正在参考不同的计算机和不同的浏览器

于 2012-12-26T07:04:16.657 回答