Php 避免用户登录到不同的浏览器或系统

Php 避免用户登录到不同的浏览器或系统,php,mysql,Php,Mysql,我有一个供不同用户使用的web应用程序。我需要做的是避免同一用户在不同的浏览器或系统中登录。有人能帮我吗???提前谢谢。您可以在mysql表中设置一个标志,如login\u staus。如果用户登录,则设置为1,否则设置为0。根据该标志,您可以做进一步的操作。另外,这不是唯一的方法,请与其他人一起检查。好的,您可以在有用户的表中添加一个标志(字段)。 当用户登录时,设置标志。i、 e.使其成为1。 在允许任何用户登录之前,只需检查标志是1还是0。 仅当相应的标志为0时才允许用户登录。我希望通过m

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

您可以在mysql表中设置一个标志,如
login\u staus
。如果用户登录,则设置为
1
,否则设置为
0
。根据该标志,您可以做进一步的操作。另外,这不是唯一的方法,请与其他人一起检查。

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

我希望通过mysql登录

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

这只是一个想法,我认为它的工作没有任何问题的饼干或会话

由于您使用的是不同的计算机和不同的浏览器

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

我建议您在用户每次登录时向其颁发新凭据。颁发新凭据的行为会使以前的凭据无效。最简单的方法是创建一个(随机)令牌,并将该令牌保存到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),并在他们注销时将其清除。)

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

在这种情况下,每次他们登录时点击页面,您都会更新数据库中的lastActivity。然后检查lastActivity是否为>=now()-x分钟。如果没有,则将其注销。当他们尝试登录时,您必须执行相同的操作。如果lastActivity>=now()-x分钟,则告诉他们无法登录


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

只需针对该用户管理mysql表中的一个标志,并在同一用户登录时始终检查该标志(即使是从同一浏览器或不同的浏览器或系统)。这可以通过从ip跟踪使用位置并通知他未授权的访问来实现,就像facebook和gmail一样。比如给他发邮件:)如果用户无法注销怎么办?她如何才能登录到新会话?@JamesS-这就是为什么我提到这不是唯一的方法,他/她可能会按照您的方式处理。好的,这很好,我以前也这么做过。现在我的问题是,当用户清除缓存或会话超时时,我无法在会话销毁时从数据库中删除该行。您是否会在这方面提供帮助???@soulpower如果您之前才指定您喜欢,那么为什么还要再次问您应该问的问题具体回答你的问题。我的意思是在你问之前想一想。我不明白为什么有必要这么做。如果您正在使用创建一个新令牌来自动使以前的令牌无效,并且用户登录,获取一个新令牌,然后会话超时,那么用户将丢失有效令牌——它不再存在于您的数据库之外。
//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
}