ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Конфигурирование управления сеансами. Аутентификация средствами управления сеансами

Управление сеансами

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

Таблица. Опции конфигурации сеансов
Имя опции По умолчанию; Действие
session.auto_start 0 (запрещено) Автоматический запуск сеансов.
session.cache_expire 180 Установка времени жизни для кэширования страниц сеанса (в минутах).
session.cookie_domain нет Домен для установки в cookie-наборе сеанса.
session.cookie_lifetime 0 Продолжительность действия cookie-набора идентификатора сеанса на машине пользователя. По умолчанию 0 — пока не будет закрыт браузер.
session.cookie_path / Путь для установки в cookie-наборе сеанса.
session.name PHPSESSID Имя сеанса, которое в системе пользователя используется как имя cookie-набора.
session.save_handler файлы Место хранения данных сеанса. Здесь можно указать базу данных, однако для этого потребуется реализовать собственные функции.
session.save_path / tmp Путь к месту хранения данных сеанса. Выражаясь более обобщенно — аргумент, передаваемый обработчику session.save_handler
session.use_cookies 1 (разрешено) Конфигурирует сеансы для использования cookie-наборов на стороне клиента.

Пожалуй, чаще всего управление сеансами применяется для хранения информации о пользователях после их аутентификации через механизм входной регистрации. В предлагаемом примере сочетаются аутентификация с помощью базы данных MySQL и использование механизма управления сеансами. Эти возможности можно использовать в разрабатываемых веб-проектах. В нашем примере будет использована база данных аутентификации, созданная в разделе Хранение паролей. Шифрование паролей.

Пример состоит из трех простых сценариев. Первый, authmain.php, обеспечивает форму для входной регистрации и аутентификации пользователей веб-сайта. Второй, membes_only.php, предоставляет информацию только для тех пользователей, которые успешно прошли входную регистрацию. Третий, logout.php, реализует выход пользователя из системы.

Чтобы понять, как все это работает, достаточно посмотрено на рисунки приведенные ниже. Первый из них — это исходная страница, выводимая сценарием authmain.php.

Поскольку пользователь еще не зарегистрирован, для него отображается страница входной регистрации

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

Не прошедшим входную регистрацию пользователям не разрешен просмотр содержимого сайта - вместо этого они увидят данное сообщение

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

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

Рассмотрим код этого приложения. Большая часть кода сосредоточена в сценарии authmain.php.

authmain.php —главная часть приложения аутентификации

<?php
session_start();
if(isset($_POST['userid'])&& isset($_POST['password']))
{
//если пользователь как раз пытался зарегистрироваться
$userid = $_POST['userid'];
$password = $_POST['password'];
$db_conn = new mysqli ('localhost', 'root', 'pass', 'mydb');
if(mysqli_connect_errno())
{
echo ' Невозможно подключиться к базе данных: '. mysqli_connect_error();
exit();
}
$query = "select * from author_users
where name = '$userid'
and pass = sha1('$password')"
;
$result = $db_conn->query($query);

if($result->num_rows > 0)
{
//Если пользователь найден в базе данных, регистрируем его идентификатор
$_SESSION['valid_user'] = $userid;
}
$db_conn->close();
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Домашняя страница</title>
</head>

<body>
<h1>Домашняя страница</h1>
<?php
if(isset($_SESSION['valid_user']))
{
echo ' Вы вошли как '.$_SESSION['valid_user']. '<br>';
echo '<a href ="logout.php">Выход</a><br>';
}
else
{
if(isset($userid))
{
//Была предпринята неудачная попытка зарегистрироваться
echo 'Вход невозможен. <br>';
}
else
{
//Пользователь либо не пытался войти, либо уже вышел
echo 'Вы не вошли в систему <br>';
}

?>
<table width="300" border="0" cellspacing="0" cellpadding="0">
<tr>
<form action="authmain.php" method="post">
<td>Имя</td>
<td><input name="userid" type="text" size="25" maxlength="20"></td>
</tr>
<tr>
<td>Пароль</td>
<td> <input name="password" type="password" size="25" maxlength="20"></td>
</tr>
<tr>
<td> </td>
<td><input name="" type="submit" value="Вход"></td>
</tr>
</form>
</table>
<?php }?>
<br>
<a href="members_only.php">Раздел для зарегистрированных пользователей</a>
</body>
</html>

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

Работа этого сценария сосредоточена вокруг переменной $valid_user.

Основная идея заключается в том, что если кто-либо успешно прошел процедуру аутентификации, регистрируется переменная сеанса с именем $_SESSION [ '$valid_user' ], которая хранит идентификатор пользователя.

Первое, что выполняется в сценарии — вызов session_start(). Эта функция загружает переменную сеанса $valid_user, если эта переменная была зарегистрирована.

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

<table width="300" border="0" cellspacing="0" cellpadding="0">
<tr>
<form action="authmain.php" method="post">
<td>Имя</td>
<td><input name="userid" type="text" size="25" maxlength="20"></td>
</tr>
<tr>
<td>Пароль</td>
<td> <input name="password" type="password" size="25" maxlength="20"></td>
</tr>
<tr>
<td> </td>
<td><input name="" type="submit" value="Вход"></td>
</tr>
</form>
</table>

Когда пользователь щелкнет по кнопке отправки формы (с надписью Вход), сценарий вызывается заново, и все повторяется сначала. На этот раз будут доступны имя пользователя и пароль, позволяющие его аутентифицировать, которые храняться в $_POST [ 'userid' ] и $_POST['password']. "ckb эти переменные установлены, управление передается к блоку аутентификации:

if(isset($_POST['userid'])&& isset($_POST['password']))
{
//если пользователь как раз пытался зарегистрироваться
$userid = $_POST['userid'];
$password = $_POST['password'];
$db_conn = new mysqli ('localhost', 'root', 'pass', 'mydb');
if(mysqli_connect_errno())
{
echo ' Невозможно подключиться к базе данных: '. mysqli_connect_error();
exit();
}
$query = "select * from author_users
where name = '$userid'
and pass = sha1('$password')"
;
$result = $db_conn->query($query);

Далее осуществляется подключение к базе данных MySQL, и проверяется имя пользователя и пароль. Если в базе данных есть такая пара, создается переменная $_SESSION [ 'valid_user' ],содержащая идентификатор для конкретного пользователя. Таким образом, мы всегда будем знать, кто вошел в систему.

if($result->num_rows > 0)
{
//Если пользователь найден в базе данных, регистрируем его идентификатор
$_SESSION['valid_user'] = $userid;
}
$db_conn->close();
}

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

if(isset($_SESSION['valid_user']))
{
echo ' Вы вошли как '.$_SESSION['valid_user']. '<br>';
echo '<a href ="logout.php">Выход</a><br>';
}

Если же попытка войти у пользователя по какой-то причине потерпела неудачу, то у нас имеется идентификатор пользователя, но нет переменной $_SESSION['valid_user'], поэтому можно выводить сообщение об ошибке:

if(isset($userid))
{
//Была предпринята неудачная попытка зарегистрироваться
echo 'Вход невозможен. <br>';
}>

С главным сценарием покончено. Посмотрим теперь страницу "Только для зарегистрированных пользователей".

members_only.php —код раздела для зарегистрированных пользователей в процедуре проверки веб-сайтом достоверности пользователя

<?php
session_start();
echo '<h1>Только для зарегистрированных пользователей</h1>';
//Проверить переменные сеанса
if(isset($_SESSION['valid_user']))
{
echo '<p>Вы вошли как ' .$_SESSION['valid_user'].'</p>';
echo '<p>Далее следует содержимое, предназначенное только для зарегистрированных пользователей.</p>';
}
else
{
echo '<p>Вы не вошли в систему.</p>';
echo '<p>Эта страница для вас недоступна</p>';
}
echo '<a href="authmain.php">На главную страницу</a>';
?>

Представленный код просто запускает сеанс и проверяет, зарегистрирован ли пользователь в текущем сеансе, то есть проверяет, установлено ли значение $_SESSION['valid_user']. Если пользователь вошел в систему, отображается содержимое сайта, предназначенное только для зарегистрированных пользователей, в противном случае пользователю сообщается, что у него нет прав просматривать это содержимое.

И в завершении рассмотрим сценарий lodout.php, который осуществляет выход пользователя из системы.

logout.php —этот сценарий регистрирует переменную сеанса и уничтожает сеанс

<?php
session_start();
//Сохранить для проверки, входил ли пользователь в систему
$old_user = $_SESSION['valid_user'];
unset($_SESSION['valid_user']);
session_destroy();
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Выход</title>
</head>

<body>
<h1>Выход</h1>
<?php
if(!empty($old_user))
{
echo 'Успешный выход. <br>';
}
else
{
//Если пользователь не входил в систему, но каким-то образом попал на эту страницу
echo 'Вы не входили в систему, поэтому и выходить из нее не нужно.<br>';
}
?>
<a href="authmain.php">На главную страницу</a>
</body>
</html>

Приведенный код очень прост, но местами довольно-таки изворотлив. Мы запускаем сеанс, запоминаем старое имя пользователя, разрегистрируем переменную $valid_user и завершаем сеанс. После этого мы выдаем пользователю сообщение, смысл которого зависит от того, вышел он из системы, или даже не выходил из нее.

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