Принудительный пользователь для выхода из сеанса PHP

Кажется, я не могу найти прямой ответ на этот вопрос. Есть ли способ, с помощью которого я могу заставить зарегистрированного пользователя выйти из системы? Моя система входа в систему, по сути, полагается только на сеанс, содержащий уникальный идентификатор пользователя (который хранится в базе данных mysql). Так что просто …

if (isset($_SESSION['user_id'])) { echo "You're logged in!"; } else { echo "You need to login!"; } 

Но предположим, что я хочу запретить этого пользователя, поэтому я могу изменить свой статус на запрет в моей базе данных, но это ничего не сделает, пока пользователь не выйдет из системы и не попытается войти в систему … Итак, как я могу заставить этого пользователя выйти из системы? Предпочтительно, не проверяя каждый раз, что они просматривают страницу независимо от того, переключен ли статус на «запрет», потому что это кажется излишним стрессом на моем сервере. Любая помощь приветствуется, спасибо.

Либо вам нужно проверять каждый раз, когда они загружают страницу, либо, возможно, смотреть на вызов Ajax через заданные интервалы, чтобы проверить их статус из БД.

Затем вы можете использовать session_destroy(); завершить свою сессию. Это разрушит их всю сессию.

В противном случае вы можете использовать unset($_SESSION['user_id']); для отмены одной переменной сеанса

Предпочтительно, не проверяя каждый раз, что они просматривают страницу независимо от того, переключен ли статус на «запрет», потому что это кажется излишним стрессом на моем сервере.

Загрузка пользователя из базы данных при каждой загрузке страницы, а не сохранение копии пользователя в сеансе, является вполне разумным решением. Это также предотвращает синхронизацию пользователя с копией в базе данных (так, например, вы можете изменить свойства или разрешения пользователя, без необходимости их выхода из системы и обратно).

Вы можете отключить его.

 unset($_SESSION['user_id']) 

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

Таким образом, вы можете сохранить данные сеанса для определенного пользователя в файле с именем <user_id>.session например. Затем, чтобы выйти из системы, просто удалите этот файл.

Вызов Ajax через интервал добавит дополнительную нагрузку на сервер. Если вы хотите, чтобы в реальном времени отвечали ваши действия (например, пользователь будет выходить из системы сразу же, когда вы запретите их из бэкэнда вашей системы), тогда вы должны изучить что-то вроде Server Push .

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

Попробуйте поместить это на каждую страницу …

 if (isset($_SESSION['user_id'])) { $sql = "SELECT from tbl where status='banned' and user_id=$_SESSION['user_id'] "; $query = mysql_query($sql); if(!empty(mysql_num_rows($query))){ // found the banned user //redirect to logout or //session_destroy(); } } else { echo "You need to login!"; } 

если пользователь все еще зарегистрирован … проверьте, запрещен ли его статус или нет … если запрещен .. затем выйдите из системы

Это работало для меня, используя pHP 5.4, включая «connect.php»;

  session_start(); if(session_destroy()) { header("Location: login.php"); } 

Вы можете использовать session_save_path() чтобы найти путь, где PHP сохраняет файлы сеанса, а затем удалять их с помощью функции unlink() .

После удаления файла сеанса, хранящегося в PHPSESSID cookie PHPSESSID стороне PHPSESSID больше не будет действительным для аутентификации, и пользователь будет автоматически выходить из приложения из вашего приложения.

Будьте внимательны при использовании этого подхода, если этот путь окажется глобальным / tmp-каталогом! Там будут другие процессы, кроме PHP, где хранятся временные данные. Если PHP имеет свой собственный каталог, выделенный для данных сеанса, он должен быть довольно безопасным.

Существует несколько способов сделать это лучше всего, на мой взгляд, исходя из безопасности: ПРИМЕЧАНИЕ: ЭТО ДЕЙСТВИТЕЛЬНО … Я знаю, что синтаксис неправильный, его просто для вас, чтобы получить представление.

 $con = mysql_connect("localhost","sampleuser","samplepass"); if (!$con) { $error = "Could not connect to server"; } mysql_select_db("sampledb", $con); $result = mysql_query("SELECT * FROM `sampletable` WHERE `username`='".$_SESSION['user_id']."'"); $userdeets = mysql_fetch_array($result); if($_SESSION['sessionvalue'] != $userdeets['sessionvalue']) { session_destroy(); Header('Location: logout.php'); } else { $result2 = mysql_query("UPDATE `sessionvalue` WHERE `username`='".$_SESSION['user_id']."' SET `sessionvalue` = RANDOMVALUE''"); $sesval = mysql_fetch_array($result2); $_SESSION['sessionvalue'] = $seshval } 

Теперь я знаю, что это не тот код, а по существу то, что вам нужно сделать, чтобы быть в безопасности и иметь эту способность:

  • Каждый раз при загрузке страницы значение сеанса соответствует значению в БД.
  • Каждый раз, когда загрузка страницы устанавливает новое значение сеанса на основе случайного генерируемого значения БД. вам также нужно будет сохранить имя пользователя в сеансе.
  • если идентификаторы сеанса не совпадают, вы уничтожаете сеанс и перенаправляете их.
  • если он соответствует, вы делаете новый идентификатор сеанса.

если вы хотите запретить пользователя, вы можете установить значение sessionvalue в БД на значение, подобное «BANNED». это значение не позволит им войти в систему. таким образом, вы можете контролировать пользователя через простую веб-форму, и вы также можете легко генерировать список запрещенных пользователей и т. д. и т.д. Мне жаль, что у меня не было больше времени, чтобы объяснить это. Я надеюсь, что это поможет.