我正在寻找有关如何在PHP中销毁特定会话的见解。通过合作伙伴网站,用户使用令牌登录主网站并获得完整会话。
如果用户从合作伙伴网站注销,合作伙伴网站也可以调用销毁功能。然后我们也应该注销我们自己的用户。
最好的方法是什么? Zend_Session destroy方法不接受参数,类似PHP函数 session_destroy 也不接受。
我正在考虑两种选择:
直接从文件/内存缓存中删除会话信息,但更喜欢“清理”方法。
检查每个页面请求是否为“令牌”用户;如果然后通过维护列表检查他们的令牌是否已过期。这会增加繁忙网站的开销,但可能是我唯一的选择。
或者我没有看到第三种/更好的方法吗?
答案 0 :(得分:4)
无需滚动自己的会话处理。
session_id()可以使用参数,即您要使用的会话ID。
因此,当您将用户传递给合作伙伴网站时,请传递其session_id(或某些令牌或其他内容)。
然后允许合作伙伴网站点击这样的脚本:
杀-用户session.php文件
<?php
/**
* Destroy any active session identified by $_POST['sid']
*/
session_id($_POST['sid']);
session_start(); //this line may not even be necessary
session_destroy(); //destroys that session.
因此,当用户在合作伙伴网站上注销时,合作伙伴网站会将session_id(您提供给他们)发送到您的kill-user-session脚本,并且用户的会话将在您的服务器上销毁。
当然,您可能希望通过某种方法或其他方法限制对kill-user-session.php的访问。
答案 1 :(得分:1)
如果您希望能够“踢”用户的会话,唯一可行的方法就是使用MySQL(或其他db,sqlite甚至)进行会话存储。
然后,您只需从数据库中删除条目即可终止会话。
这也允许你做一些事情,比如“控制”特定用户的会话和其他东西:)
这是一个非常基本的运行:http://www.devshed.com/c/a/MySQL/Custom-Session-Management-Using-PHP-and-MySQL/(不是最好的例子,但足够好的完整示例来启动你)。
修改强>
此外,如果通过合作伙伴网站注销,我过去使用的另一种方法(与O2和其他此类网站一起使用),他们也会获得“回调”(大多数情况下都是REST API调用),他们也会当用户退出他们的网站时需要打电话。
答案 2 :(得分:-2)
数据库解决方案意味着会话数据库需要在主网站和合作伙伴网站之间共享,而这通常不是这样的情况等等。沿着这些微不足道的行可能就足够了吗?
<img src="mainwebsite/logout.php">
mainwebsite / logout.php:
<?php session_destroy(); ?>