2017-01-01 2 views
-1

Я пытаюсь создать систему входа в систему, которая в зависимости от типа входа будет отображать другую страницу. (Т.е. вошли в систему как администратор, или различные другие роли)Проблемы с сеансом входа/выхода

Это состоит из трех файлов:

login.php - различные формы представлены здесь, и в зависимости от названия формы стоимости, устанавливает переменную сеанса на правильный уровень (администратор и т. д.)

Logout.php - отменяет ранее упомянутую переменную.

Dashboard.php - Проверяет, является ли переменная установлена, если да, то загрузите Релевент информацию, если нет, отправить обратно в index.php

Вы найдете ниже код:

login.php

<?php 
session_start(); 
if (isset($_POST['uname_driver'])) 
{ 
    $username = $_POST['uname_driver']; 
    $hpassword = password_hash($_POST['hpass_driver'], PASSWORD_DEFAULT); 
    // Check here for login details within server 
    $_SESSION['loggedIn'] = "driver"; 
    header("Location: dashboard.php"); 
} 
if (isset($_POST['uname_restaurant'])) 
{ 
    $username = $_POST['uname_restaurant']; 
    $hpassword = password_hash($_POST['hpass_restaurant'], PASSWORD_DEFAULT); 
    // Check here for login details within server 
    $_SESSION['loggedIn'] = "restaurant"; 
    header("Location: dashboard.php"); 
} 
if (isset($_POST['uname_admin'])) 
{ 
    $username = $_POST['uname_admin']; 
    $hpassword = password_hash($_POST['hpass_admin'], PASSWORD_DEFAULT); 
    // Check here for login details within server 
    $_SESSION['loggedIn'] = "admin"; 
    header("Location: dashboard.php"); 
} 

Logout.php- ред отразить ответ Juned в го в решаемой одной части проблемы

<?php 
// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 


header("Location: index.php"); 

Dashboard.php

<?php 
session_start(); 
include("header.php"); 
if (isset($_SESSION['loggedIn'])) 
{ 
    switch ($_SESSION['loggedIn']) 
    { 
     case "admin": 
      include("admin_dashboard.php"); 
      break; 
     case "driver": 
      include("driver_dashboard.php"); 
      break; 
     case "restaurant": 
      include("restaurant_dashboard.php"); 
      break; 
    } 
} 
else 
{ 
    header("Location: index.php"); 
} 
?> 

Logging в, кажется, работает абсолютно нормально, пока я не пытаться войти из снова, выхода из системы достигается событие onclick определенной кнопки на приборной панели и столбец JQuery, например:

$('#logoutOfDashboard').click(function(e) 
{ 
    e.preventDefault(); 
    var reallyLogout=confirm("Do you really want to log out?"); 
    if(reallyLogout) 
    { 
     $.post('logout.php', {}) 
     .done(function(data) 
     { 
      window.location.replace("/"); 
     }) 
    } 
}); 

Опять же, это похоже на работу, однако, если я вручную введу /dashboard.php в строку URL, он возвращает меня обратно в index.php, как и ожидалось. Теперь всякий раз, когда отправляется форма входа в систему, а переменная сеанса должна быть воссоздана, dashboard.php непрерывно возвращается к индексу, как будто его нет, и я больше не могу войти в этот сеанс. Это почти как если переменная сеанса является кэширование на отключенном и никогда не может быть повторно установлено

Я попытался добавлять в различном нет кэширования информации заголовка, таких как:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 

Но это, кажется, не имеет никакого эффекта , Любая помощь или понимание в этом будет высоко оценена.

РЕДАКТИРОВАТЬ

Index.php

<?php 
include("header.php"); 
?> 
<body> 
    <div class="container"> 
     <div class="jumbotron"> 
      <h1>Website Coming Soon!</h1> 
     </div> 

     <div class="row marketing"> 
      <div class="col-lg-6 center-block"> 
       <a class="btn btn-lg btn-success btn-space center-block" href="/restaurant_login.php" role="button">Log In As Restaurant</a> 
      </div> 

      <div class="col-lg-6 center-block"> 
       <a class="btn btn-lg btn-primary btn-space center-block" href="/driver_login.php" role="button">Log In As Driver</a> 
      </div> 
     </div> 


     <footer class="footer"> 
      <p>&copy; 2016</p> 
     </footer> 
    </div> 
</body> 

header.php

<?php 
date_default_timezone_set('Europe/London'); 
require_once('config.php'); 
require_once('functions.php'); 
function autoloader($class) 
{ 
    require_once(PUBLIC_BASE_PATH_PHP . "classes/$class.php"); 
} 

spl_autoload_register("autoloader"); 

global $dbConn; 
$dbConn = null; 

if(!Database::connect()) 
{ 
    die("Unable to connect to the database"); 
} 
?> 

<head> 
    <!-- Footer these scripts at end --> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> 

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 

    <!-- Merge these together and minify at end --> 
    <link rel="stylesheet" href="css/jumbotron-narrow.css"> 
    <link rel="stylesheet" href="css/signin.css"> 
    <link rel="stylesheet" href="css/style.css"> 
</head> 

RestarauntLogin.PHP

<?php Header("Cache-Control: max-age=3000, must-revalidate"); 
include("header.php"); 
?> 

<div class="container"> 
    <form class="form-signin" action="/login.php" method="post"> 

    <h2 class="form-signin-heading">Please sign in</h2> 

    <label for="inputEmail" class="sr-only">Email</label> 
    <input type="email" name = "uname_restaurant" id="inputEmail" class="form-control" placeholder="Email" required autofocus> 

    <label for="inputPassword" class="sr-only">Password</label> 
    <input type="password" name = "hpass_restaurant" id="inputPassword" class="form-control" placeholder="Password" required> 

    <button class="btn btn-lg btn-success btn-block" type="submit">Sign in</button> 
    <a href = "/" class="btn btn-lg btn-primary btn-block" role="button">Back</a> 

    </form> 

</div> 
+0

Я считаю, что проблема в том, что сессия снята с охраны после того, как страница перезагружается, потому что PHP является серверной системы, и это не является динамическим, что приводит к $ _SESSION еще не будет установлен, пока окно перезагружается, то есть если вы динамически загружаете окно через jQuery, он все равно скажет, что вы вошли в систему – Imphusius

+0

. Должен прочитать, как работают сессии и файлы cookie сеансов, и не видите, почему вы даже используете ajax для выхода из системы, так как вы все равно перенаправляете было бы лучше обработать на сервере – charlietfl

+0

Я попытался удалить все Jquery для выхода из системы, и просто имея href, что отправляет пользователя в logout.php (с дополнительным заголовком (Location: index.php) в конце logout.php) с тем же эффектом. – Aphire

ответ

3

Вы должны уничтожить сессию, поэтому вместо того, чтобы просто снятия с охраны $ _SESSION [ «LoggedIn»], вы должны полностью уничтожить сессию, поедая куки сессии. PHP имеет встроенную функцию для этого: session_destroy();

См: http://php.net/manual/en/function.session-destroy.php

<?php 
// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 
?> 
+0

Я попытался использовать это (изменение unset на session_destroy), а также попробовать оба, но с точно таким же результатом. – Aphire

+0

Спасибо за редактирование, похоже, это решение одной из проблем! :) Теперь после выхода из системы, если пользователь снова попытается получить доступ к /dashboard.php, он будет правильно отбросить их обратно в индекс. однако у меня все еще есть проблема с невозможностью снова войти в систему после этого. – Aphire

+0

Опубликуйте исходный код index.php – Juned

0

Вместо использования window.location.replace(), попробуйте использовать window.location.href='/'

+0

Тот же вопрос, я боюсь, спасибо за попытку! – Aphire

1

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

Я написал простой код для системы входа, который, я считаю, поможет понять это. Прежде чем смотреть в код Aphire, я хотел бы упомянуть, что нет смысла использовать Ajax в коде, потому что в последнее время обновляется страница, поэтому было бы хорошо, если бы вы перенаправили своего пользователя прямо на logout.php.

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

login.php

<?php 
$name = $_GET['name']; 
session_start(); 

if(isset($_SESSION['loggedIn'])) 
{ 
    header("Location: dashboard.php"); 
} else { 
    if (isset($name)) 
    { 
      $_SESSION['loggedIn'] = $name; 
      header("Location: dashboard.php"); 
    } else { 
     echo "Please provide correct input"; 
    } 
} 
?> 

logout.php

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

// Finally, destroy the session. 
session_destroy(); 


header("Location: login.php"); 
?> 

dashboard.php

<?php 
session_start(); 

if (isset($_SESSION['loggedIn'])) 
{ 
    switch ($_SESSION['loggedIn']) 
    { 
     case "admin": 
      echo "admin"; 
      break; 
     case "driver": 
      echo "driver"; 
      break; 
     case "restaurant": 
      echo "restaurant"; 
      break; 
    default: 
     header("Location: login.php"); 
     session_destroy(); 
    } 
} 
else 
{ 
    header("Location: login.php"); 
} 
?> 

<a href="logout.php">Logout</a> 
+0

Hi Harsh, спасибо за фрагменты кода, я фактически удалил AJAX из выхода и взял часть кода из фрагментов и интегрировал его в свою, но у меня такая же проблема :( – Aphire

+0

Hi Aphire, Can вы, пожалуйста, поделитесь обновленным кодом, чтобы я мог его изучить? – Harsh

+0

Hi Harsh, я все еще разрабатываю его на данный момент, я отредактирую свой вопрос, как только смогу, у меня есть что-то стабильное, которое не будет измените какое-то время. Большое спасибо за то, что вы его придерживаетесь. – Aphire

4

Я попытался CREA ting локальную тестовую страницу с моего компьютера с помощью ваших кодов. Кажется, он работает нормально. Что я могу предложить, если вы имеете дело с сеансами и куки-файлами, и вы сделали много тестов или отладки, которые иногда испортили браузер. Попробуйте очистить кеш/файлы cookie. Я хотел поставить это в раздел комментариев, но у меня недостаточно репутации :) Но если это не помогло, скажите мне, и я удалю его.

+0

Hi Roljhon, Это абсолютно помогло. Приятно знать, что я не схожу с ума, и что это странная проблема, а не я просто глупо. Спасибо! – Aphire

+0

Рад слышать, что исправил проблему приятеля. Счастлив помочь :) Это заставило меня сходить с ума, прежде чем думать, что, черт возьми, происходит на самом деле: D Но, в любом случае, приятель! – Roljhon

+0

К сожалению, у меня все еще есть проблема, но тот факт, что вы ее протестировали локально и, похоже, работает, заставляет меня чувствовать себя намного лучше: P, Возможно, переход на другой сервер может решить мою проблему всеохватывающе. +1 от меня :) – Aphire

0

Вы пытались сохранить идентификатор сеанса, но просто удалите данные сеанса? Я думаю, нет смысла удалять идентификатор сеанса.

Я говорю об удалении этого куска кода из logout.php:

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 

Итак, logout.php теперь выглядит следующим образом:

<?php 
// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

header("Location: index.php"); 

Это должно быть достаточно, чтобы "выйти из системы" пользователя.

+0

Вот как я это сделал изначально, и я только что проверил ее снова. К сожалению, это позволяет пользователю по-прежнему обращаться к /dashboard.php после выхода из системы, пока они не контролируют + F5 (сброс кеша). и после этого проблема с невозможностью входа в систему и повторного создания сеанса по-прежнему происходит как обычно :( – Aphire

+0

Итак, похоже, что у вас проблема с кешем, и никаких проблем с сеансом нет. Возможно, после этого при повторном входе в систему и он выглядит неудачным, если вы также нажимаете CTRL + F5, вы снова попадаете на панель инструментов. – peiiion

+0

Также вы упомянули, что пытались отправить заголовки, связанные с кешем, в файл header.php, но этот файл не используется login.php и logout.php, поэтому браузер может кэшировать перенаправления на эти ответы.Я бы создать файл cache.php (просто проверить) и поместить туда заголовок кэша: 'Cache-Control: no-cache , no-store, must-revalidate' Включите этот файл из ВСЕХ других php-файлов, которые у вас есть. – peiiion

0

Я создал небольшую версию из ваших фрагментах & пробовали его на моем локальном хосте, как это случилось с Roljhon

Все, кажется, работает хорошо. Я думаю, что может возникнуть проблема с другим кодом или конфигурациями вашего сервера. Не могу сказать.

В случае это может помочь, вот код, который я тестировал с:

LoginForm.php

<?php 
Header("Cache-Control: max-age=3000, must-revalidate"); 
//include("header.php"); 
?> 
<div class="container"> 
    <form class="form-signin" action="login.php" method="post"> 
    <input type="email" name = "uname_restaurant" id="inputEmail" class="form-control" placeholder="Email" required autofocus> 
    <input type="password" name = "hpass_restaurant" id="inputPassword" class="form-control" placeholder="Password" required> 
    <button class="btn btn-lg btn-success btn-block" type="submit">Sign in</button> 
    </form> 
</div> 

login.php

<?php 
session_start(); 
if (isset($_POST['uname_restaurant'])) 
{ 
    $username = $_POST['uname_restaurant']; 
    $hpassword = password_hash($_POST['hpass_restaurant'], PASSWORD_DEFAULT); 
    $_SESSION['loggedIn'] = "restaurant"; 
} 
var_dump($_SESSION); 
die("Location: dashboard.php"); 

панель. php

<?php 
session_start(); 
//include("header.php"); 
if (isset($_SESSION['loggedIn'])) 
{ 
    switch ($_SESSION['loggedIn']) 
    { 
     case "admin": 
      die("admin_dashboard.php"); 
      break; 
     case "driver": 
      die("driver_dashboard.php"); 
      break; 
     case "restaurant": 
      die("restaurant_dashboard.php"); 
      break; 
    } 
} 
else 
{ 
    die("Location: index.php"); 
} 

logout.php

<?php 
// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 

die("Location: index.php"); 
Смежные вопросы