Как я могу отменить сеанс определенного пользователя?

У меня есть сеанс, подобный этому $_SESSION['login'], и когда он равен 1, это означает, что использование регистрируется на моем веб-сайте:

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

Также у меня есть еще один сеанс, который содержит идентификатор пользователя. Что-то вроде этого:

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

Теперь я хочу отключить $_SESSION['login'] для пользователя с определенным идентификатором. Например, я хочу unset($_SESSION['login']) для $_SESSION["Id"] = 234124. Как я могу это сделать?


Изменить: все, что я пытаюсь сделать: когда пользователь меняет свой пароль, я удаляю все его файлы cookie из таблицы cookies, чтобы выйти из системы со всех других его устройств. Также я хочу удалить его сеанс.


person stack    schedule 27.07.2016    source источник


Ответы (1)


Если я правильно понял, вы хотите полностью разлогинить пользователя, т.е. со всех сессий (с ноутбука, мобильного телефона и т.д.).

Это возможно только в том случае, если 1) у вас есть сопоставление user_id => session_id и 2) вы можете как-то запрашивать сеансы. Например, когда вы храните сеансы в таблице базы данных и у вас есть user_id в качестве столбца в этой таблице, вы можете просто удалить все сеансы для пользователя (или просто изменить их).

Но это невозможно с обработчиком сеанса PHP по умолчанию. У вас нет такого типа сопоставления.

Я советую вам написать собственный обработчик сеансов, который хранит сеансы в таблице базы данных. Чтобы построить сопоставление, вы можете переопределить writeметод и извлечь туда свой user_id. Будьте осторожны с сериализованными данными, обратите внимание на session.serialize_handler директиву конфигурации< /а>.

Например,

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);
}
person Alexey Shokov    schedule 27.07.2016