Я пытаюсь создать систему входа в систему, которая в зависимости от типа входа будет отображать другую страницу. (Т.е. вошли в систему как администратор, или различные другие роли)Проблемы с сеансом входа/выхода
Это состоит из трех файлов:
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>© 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>
Я считаю, что проблема в том, что сессия снята с охраны после того, как страница перезагружается, потому что PHP является серверной системы, и это не является динамическим, что приводит к $ _SESSION еще не будет установлен, пока окно перезагружается, то есть если вы динамически загружаете окно через jQuery, он все равно скажет, что вы вошли в систему – Imphusius
. Должен прочитать, как работают сессии и файлы cookie сеансов, и не видите, почему вы даже используете ajax для выхода из системы, так как вы все равно перенаправляете было бы лучше обработать на сервере – charlietfl
Я попытался удалить все Jquery для выхода из системы, и просто имея href, что отправляет пользователя в logout.php (с дополнительным заголовком (Location: index.php) в конце logout.php) с тем же эффектом. – Aphire