2012-01-25 3 views
9

В настоящее время я работаю на сайте, на котором есть вход (имя пользователя и пароль). Защита паролем выполняется операционной системой внутри веб-сервера на уровне папок, называемом Realm внутри ОС. Пока это нужно будет сделать, пока мы не выясним правильную систему регистрации PHP.Сессия PHP Session Destroy on Log Out

Код ниже, основан на previous question on the stack overflow.

Я использую 3 файла (см фрагменты кода в нижней части).

Процесс: - Нажмите кнопку «Вход» на index.php - введите имя пользователя и пароль для доступа к файлу индекса аутентификации. - Нажмите кнопку выхода из системы, которая ссылается на файл logout.php - СЛЕДУЕТ очистить кеш и вернуть пользователя в индекс верхнего уровня.

Он не «разрушает сеанс» в том смысле, что вам не предлагается повторно вводить пароль при появлении запроса, что по сути является тем, что я хочу.

Мое минимальное знание php оставляет меня немного в тупике.

index.php (верхний файл уровня с журналом в кнопки)

<?php session_start(); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Test</title> 
</head> 
<body> 
<a href="authenticate/index.php">Log In Btn</a> 
</body> 
</html> 

Аутентифицировать/index.php (Эта папка защищена паролем - содержит индексный файл с помощью кнопки журнала, какие ссылки в файл logout.php)

<?php session_start(); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Log out</title> 
</head> 
<body> 
<a href="logout.php">Log Out Btn</a> 
</body> 
</html> 

Аутентифицировать/logout.php

<?php 
session_start(); //to ensure you are using same session 
session_destroy(); //destroy the session 
header("location:/index.php"); //to redirect back to "index.php" after logging out 
exit(); 
?> 
+3

Если папка защищена паролем, то PHP не делает проверку подлинности. Apache (или веб-сервер). – xbonez

+0

Это действительно имеет смысл, спасибо очень большое спасибо @xbonez – fitzilla

ответ

22

В папке с защитой паролем есть ничего, чтобы сделать с PHP!

Используемый метод называется «Базовая аутентификация». Нет никаких способов переходов между браузерами, кроме как попросить пользователя закрыть, а затем открыть их браузер ...

Вот как вы могли бы сделать это в PHP вместо этого (полностью удалите свой Apache basic auth в .htaccess или там, где это первое):

login.php:

<?php 
session_start(); 
//change 'valid_username' and 'valid_password' to your desired "correct" username and password 
if (! empty($_POST) && $_POST['user'] === 'valid_username' && $_POST['pass'] === 'valid_password') 
{ 
    $_SESSION['logged_in'] = true; 
    header('Location: /index.php'); 
} 
else 
{ 
    ?> 

    <form method="POST"> 
    Username: <input name="user" type="text"><br> 
    Password: <input name="pass" type="text"><br><br> 
    <input type="submit" value="submit"> 
    </form> 

    <?php 
} 

index.php

<?php 
session_start(); 
if (! empty($_SESSION['logged_in'])) 
{ 
    ?> 

    <p>here is my super-secret content</p> 
    <a href='logout.php'>Click here to log out</a> 

    <?php 
} 
else 
{ 
    echo 'You are not logged in. <a href="login.php">Click here</a> to log in.'; 
} 

logout.php:

<?php 
session_start(); 
session_destroy(); 
echo 'You have been logged out. <a href="/">Go back</a>'; 

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

Надеюсь, это поможет вам понять, что происходит.

+0

Awesome! Гораздо лучше, чем метод проверки подлинности HTTP, из которых код выхода из системы намного сложнее. Если вы добавите теги закрытия PHP во всех трех кодовых блоках, я отвечу вам. Ой, я уже это сделал! :-) –

+1

@FrankConijn См. Http://php.net/manual/en/language.basic-syntax.phptags.php: «Если файл является чистым PHP-кодом, предпочтительно опустить закрывающий тег PHP на конец файла. Это предотвращает случайные пробелы или новые строки, добавляемые после тега закрытия PHP, что может вызвать нежелательные эффекты, потому что PHP начнет буферизацию вывода, когда нет намерения программиста отправлять любой вывод в этой точке скрипта. " – stackunderflow

+0

Я думаю, что выход должен быть реализован с использованием метода post, а не get. – chespinoza

3

Сначала отправьте ссылку logout.php в этой кнопке выхода.В этой странице сделать код, который приводится ниже:

Вот код:

<?php 
session_start(); 
session_destroy(); 
?> 

Когда сессия началась, была запущена сессия последнего/пользователя тока, так что не нужно для объявления имени пользователя. Он будет автоматически удален методом session_destroy.

0

// выход из системы

if(isset($_GET['logout'])) { 
    session_destroy(); 
    unset($_SESSION['username']); 
    header('location:login.php'); 
} 

?>

+0

Благодарим вас за этот фрагмент кода, который может предоставить некоторую ограниченную краткосрочную помощь. Правильное объяснение [значительно улучшило бы] (// meta.stackexchange.com/q/114762) его долгосрочную ценность, показав * почему * это хорошее решение проблемы и сделало бы его более полезным для будущих читателей с другие, подобные вопросы. Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение, включая сделанные вами предположения. –