Пользователь периодически выходит из системы (происходит только в Chrome) - PullRequest
0 голосов
/ 10 февраля 2020

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

На странице индекса. php вот как я регистрирую Windows логин:

<form>
  <h3><?php echo $_SERVER['REMOTE_USER']; ?></h3>
  <input type="hidden" id="winUser" value="<?php echo $_SERVER['REMOTE_USER']; ?>" />
  <button type="button" id="loginSubmit">Sign in</button>
</form>

Вот jQuery для захвата идентификатора winUser:

$('#loginSubmit').on('click', function()
{
  var winUser = $('#winUser').val();
  $.post('windowsUserCheck.php', {winUser:winUser}, function(data)
  {
    if(data.indexOf("Error") >= 0)
    {
      $('#errorModal').modal('show');
      return false;
    }
    else
    {
      location.href = "home.php";
    }
  });
});

Вот процесс, называемый windowsUserCheck. php:

<?php
include("include/sessions.php");

if(isset($_POST['winUser']))
{
  $windowsusername = $_POST['winUser'];

  $sql = 'SELECT `uid`, `username`, `fullname`, `department`, `email`, `password`, `userlevel` FROM users WHERE `username` = :username';

  $sth = $dbc->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
  $sth->execute(array(':username' => $windowsusername));

  $res = $sth->fetchAll(PDO::FETCH_ASSOC);
  $numrows = count($res);

  if($res[0])
  {
    $_SESSION['user']['uid'] = $res[0]['uid'];
    $_SESSION['user']['username'] = $res[0]['username'];
    $_SESSION['user']['department'] = $res[0]['department'];
    $_SESSION['user']['fullname'] = $res[0]['fullname'];
    $_SESSION['user']['email'] = $res[0]['email'];
    $_SESSION['user']['userlevel'] = $res[0]['userlevel'];

    echo "Success";
  }
  else
  {
    echo "Error";
  }
}
?>

А вот сеансы. php:

<?php
  if(!isset($_SESSION['user']['username'])){session_start();}  

  include("connection.php");

  $id = $_SESSION['user']['uid'];
  $username = $_SESSION['user']['username'];
  $department = $_SESSION['user']['department'];
  $fullname = $_SESSION['user']['fullname'];
  $useremail = $_SESSION['user']['email'];
  $userlevel = $_SESSION['user']['userlevel'];
?>

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

<?php
  include("include/sessions.php");
  if(!isset($_SESSION['user']['username']) || $username == ""){header("location:index.php");}   
?>

Используя все вышеперечисленное, пользователь может войти в систему. Проблема в том, что при обновлении страницы пользователь отправляется обратно в индекс. php. Это заставляет меня верить, что сеанс очищается или уничтожается, но я не уверен, каким образом.

Почему это может происходить?

Редактировать

Я обнаружил, что это проблема возникает только в Chrome. Я могу оставаться в системе весь день, используя Firefox или Edge.

1 Ответ

2 голосов
/ 10 февраля 2020

Вот проблема:

if(!isset($_SESSION['user']['username'])){session_start();}  

Вы пытаетесь прочитать сеанс, прежде чем объявить session_start().

Чтение из PHP. net документация :

session_start () создает сеанс или возобновляет текущий сеанс на основе идентификатора сеанса, переданного через запрос GET или POST, или переданный через повара ie.

Вам необходимо объявить session_start(), прежде чем делать что-либо с сеансами, будь то чтение или манипулирование, поэтому простое изменение этой строки на следующее должно работать:

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