Как уничтожить текущий сеанс, но не другой сеанс - PullRequest
0 голосов
/ 03 мая 2020

У меня есть простой логин в системе, где есть 2 типа пользователей (роль: 0,1). Если пользователь имеет роль 0, то пользователь перенаправляется на поиск. php, иначе роль 1, перенаправляется на обзор. php.

if ($role == 0){
  session_regenerate_id();
  $_SESSION['loggedin'] = TRUE;
  $_SESSION['name'] = $_POST['email'];
  $_SESSION['id'] = $id;
  header('Location: search.php');
} elseif ($role == 1) {
  session_regenerate_id();
  $_SESSION['loggedin'] = TRUE;
  $_SESSION['user'] = $name;
  $_SESSION['name'] = $_POST['email'];
  $_SESSION['id'] = $id;
  header('Location: overview.php');
}

Я могу выйти из системы и уничтожить сеанс, но если оба Пользователь вошел в систему и один пользователь выйдет из системы, он завершит сеанс для обоих пользователей. Вот мой выход из системы. php:

<?php
// Initialize the session
session_start();

// Destroy the session.
session_destroy();

header('Location: login.php');
exit;
?>

Тогда я нашел это решение source . Я не был уверен, как получить to_destroy_id ($ des), поэтому я установил для него идентификатор текущей сессии. Вот мой обновленный выход из системы. php:

<?php
$des = session_id();
// 1. commit session if it's started.
if (session_id()) {
    session_commit();
}

// 2. store current session id
session_start();
$current_session_id = session_id();
session_commit();

// 3. hijack then destroy session specified.
session_id($des);
session_start();
session_destroy();
session_commit();

// 4. restore current session id. If don't restore it, your current session will refer to the session you just destroyed!
session_id($current_session_id);
session_start();
session_commit();
// Redirect to the login page:
header('Location: restTablet.php');

?>

Это сработало в первый раз, затем снова перестало работать. Все выходят из системы, если один пользователь выходит из системы. Я просто хотел бы уничтожить сеанс пользователя, если он нажал кнопку «Выйти», а другие пользователи остались в системе. Любая идея, как я могу это реализовать?

ОБНОВЛЕНИЕ: внесение следующих изменений в выход из системы. php Я смог оставьте других вошедших в систему, если один пользователь вышел из системы, но как только пользователь выйдет из системы и попытается go назад, пользователь сможет снова получить к нему доступ без входа в систему. Вот выход из системы. php:

<?php
$des = session_id();
// 1. commit session if it's started.
if (session_id()) {
    session_commit();
}

// 2. store current session id
session_start();
$current_session_id = session_id();
session_commit();

// 3. hijack then destroy session specified.
session_id($des);
session_start();
session_destroy();
session_commit();

// Redirect to the login page:
header('Location: gabLogin.php');
?>

1 Ответ

0 голосов
/ 03 мая 2020

Вы можете вкладывать свои данные $ _SESSION в родительский уровень. Например, у вас есть две роли, role 1 и role 2. Установите $_SESSION, как показано ниже:

if ($role == 0){
  session_regenerate_id();
  $_SESSION['role_0']['loggedin'] = TRUE;
  $_SESSION['role_0']['name'] = $_POST['email'];
  $_SESSION['role_0']['id'] = $id;
  header('Location: search.php');
} elseif ($role == 1) {
  session_regenerate_id();
  $_SESSION['role_1']['loggedin'] = TRUE;
  $_SESSION['role_1']['user'] = $name;
  $_SESSION['role_1']['name'] = $_POST['email'];
  $_SESSION['role_1']['id'] = $id;
  header('Location: overview.php');
}

Затем, когда ваш пользователь выходит из системы, скажем, role_0, сбросьте только значение родительского сеанса для этой роли.

//use logic in logout form to POST proper logout for that role.
if(isset($_POST['logout_0'])){ //--> role_0 is logging out
  unset($_SESSION['role_0']); //--> all child data for role_0 should be unset now.
  //--> check if user is logged in as alternate role
  if($_SESSION['role_1']['loggedin'] === TRUE){
    header('Location: overview.php');
  }else{
    //--> redirect to the page you wish them to go to when logged out
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...