我有一个不同用户使用的网络应用程序。我需要做的是避免同一用户登录不同的浏览器或系统。任何人都可以提供帮助???提前致谢。
答案 0 :(得分:1)
许多答案(即“登录标志”)都有一个很大的问题!如果浏览器出现问题该怎么办? (机器格式化,缓存/ 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页面之前几天到期。)
答案 1 :(得分:0)
你可以在mysql表中有一个标志,如login_staus
。如果用户登录,则设置为1
,设置为0
。根据旗帜,你可以做进一步。这也不是唯一的方法,请与他人联系。
答案 2 :(得分:0)
好吧,您可以在包含用户的表格中添加一个标志(字段)
用户登录时,设置标志。即成为1.
在允许任何用户登录之前,只需检查标志是1还是0。
仅当相应标志为0时才允许用户登录。
答案 3 :(得分: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或会话问题
因为您正在推荐不同的计算机和不同的浏览器