我只需要以这种方式限制一次登录,这样用户就无法一次多次使用一个帐户登录。用户也可以登录不同的服务器,所以我不能使用session_destroy,我需要“手动”删除会话。
当使用会话与文件存储它工作正常,我删除文件,登录新用户一切都很好。但是当我使用带memcache的会话时,我可以从memcache中删除会话,但是在同一请求中进一步登录会丢失。
我就是这样做的:
session_regenerate_id();
$session_id = session_id();
$m = new Memcache();
$m->connect('XXX.XXX.XXX.XXX', 11211);
$ans = $m->delete(SESSION_ID_OF_ALREADY_LOGGED_USER);
$query = "UPDATE activeLogins SET activeSession = '{$session_id}' WHERE userEmail = $safeEmail LIMIT 1";
$dbh->exec($query);
//Login new user...
知道可能出现什么问题吗?
答案 0 :(得分:2)
据我了解,您希望将一个用户限制为一台客户端计算机。该机器应该是最后登录的机器。我认为你应该能够通过简单检查每个页面加载来实现这一点。
根据您的问题,我可以看到您的数据库有一个名为activeLogins
的表,其中包含以下字段:activeSession
和userEmail
。
由此我假设它是唯一标识用户的电子邮件地址。因此,在新登录后,您会在$session_id
表中找到$safeEmail
,activeLogins
和相应的更新行。
现在假设用户没有注销旧机器?下一页加载会发生什么(在更新activeLogins
表之前)?是的,activeSession
将与该服务器上的$session_id
不同。请记住,新登录名已更改。
所以您需要做的就是检查$session_id
是否与activeSession
表中的activeLogins
匹配。
我还建议仅在新登录后更新activeLogins
表,而不是每次加载页面时。虽然你的问题不清楚你是否这样做。
我不确定这是否真的能回答你的问题。这似乎是一个简单的答案。不过你的问题不是很清楚。您是否真的在每次加载页面时使用按顺序显示的代码?!
为了回答您的所有答案,我一直在寻找将通知从服务器推送到客户端计算机的最佳方式。你自己提到的一种方法是ajax民意调查,但我认为这是一种不好的做法,不应该使用。
有棘轮(http://socketo.me)它会给你一个连续的连接。您可以在检测到其他登录时删除连接,并对旧客户端中的连接作出反应。
还有一个更高级别的接口,用于将事件从服务器发送到客户端:
https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events
但是在IE中不支持,因此它通常不可用。
您还可以查看http://pusher.com
所有这些建议的要点是,您可以有效地向客户推送信号,表明它应该删除对您所服务的网站的访问权限,而不会不断进行轮询。