如何取消设置特定用户的会话?

时间:2016-07-27 03:57:26

标签: php session-management

我有一个类似$_SESSION['login']的会话,当它与1相等时,就意味着使用会记录到我的网站中:

if ( $_SESSION['login'] == 1 ) {
    // You are logged
} else {
    // login/register
}

此外,我还有另一个包含用户ID的会话。像这样:

echo $_SESSION["Id"]; 
/* It is containing the user's id (an integer number).
   Something like: 234124
*/

现在我想为具有特定ID的用户取消设置$_SESSION['login']。例如,我想unset($_SESSION['login'])$_SESSION["Id"] = 234124。我怎么能这样做?

编辑:我尝试做的一切:当用户更改密码时,我会从cookies表中删除所有Cookie,以便从其他所有设备中签出。我也想删除他的会话。

1 个答案:

答案 0 :(得分:3)

如果我理解你的权利,你想要完全退出用户,即从所有会话(从笔记本电脑,手机等)注销。

只有当你有一个映射user_id => session_id和2)时才能以某种方式查询会话。例如,当您在数据库表中存储会话,并且在此表中将user_id作为列时,您可以简单地删除用户的所有会话(或者只是修改它们)。

但是使用默认的PHP会话处理程序是不可能的。您没有这种类型的映射。

我建议您编写将会话存储在数据库表中的a custom session handler。要构建映射,您可以覆盖write method并在那里提取user_id。注意序列化数据,注意session.serialize_handler configuration directive

例如,

的php.ini

session.serialize_handler = php_serialize

会话处理程序

public function write($id, $data)
{
    $content = unserialize($data);

    return $this->db->insert('sessions', [
        'id' => $id,
        'user_id' => $content['user_id'],
        'data' => $data,
    ]);
}

和控制代码

if (...) {
    $db->execute('DELETE FROM sessions WHERE user_id = ?', $userId);
}