Регистрация и авторизация пользователей
Сложно определить текст запроса, популярнее регистрации и авторизации пользователей для сайта. Пример простого сценария для ограничения доступа посетителей к узлам сайта
- Таблица в базе данных
- Внешний вид форм
- Регистрация пользователя
- Авторизация пользователя
- Проверка авторизации пользователя
- Завершение сеанса пользователя
Если вам необходимо сделать один из разделов своего сайта доступным ограниченному, но неопределенному кругу лиц, проще всего это сделать с помощью регистрации и авторизации пользователей. Есть множество способов авторизации пользователей. Можно использовать как инструменты веб-сервера, так и инструменты языка программирования. Мы поговорим о случае, когда используются сессии PHP.
Для начала давайте оговорим все шаги, которые сделаем далее. Что нам вообще нужно? Нам нужен сценарий, который будет регистрировать пользователя, авторизовать пользователя, переадресовывать пользователя куда-либо после авторизации. Также нам нужно будет создать страницу, которая будет защищена от доступа неавторизованных пользователей. Для регистрации и авторизации нам необходимо будет создать HTML-формы. Информацию о зарегистрированных пользователях мы будем хранить в базе данных. Это значит, что нам еще нужен скрипт подключения к СУБД. Всю работу у нас будут выполнять функции, которые мы сами напишем. Эти функции мы сохраним в отдельный файл.
Итак, нам нужны следующие файлы:
- соединение с СУБД;
- пользовательские функции;
- авторизация;
- регистрация;
- защищенная страница;
- сценарий завершения работы пользователя;
- сценарий, проверяющий статус авторизации пользователя;
- таблица стилей для простейшего оформления наших страниц.
Всё это будет бессмысленно, если у вас нет соответствующей таблицы в базе данных. Запустите инструмент управления своим СУБД (PhpMyAdmin или командную строку, как удобнее) и выполните в нем следующий запрос:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` char(16) NOT NULL,
`password` char(40) NOT NULL,
`reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Наши файлы со сценариями я назову так (все они будут лежать в одном каталоге):
- database.php;
- functions.php;
- login.php;
- registration.php;
- index.php;
- logout.php;
- checkAuth.php;
- style.css.
Назначение каждого из них, я уверен, вам понятно. Начнем со скрипта соединения с СУБД. Вы его уже видели. Просто сохраните код этого скрипта в файле с именемdatabase.php. Пользовательские функции мы будем объявлять в файлеfunctions.php. Как это всё будет работать? Неавторизованный пользователь пытается получить доступ к защищенному документуindex.php, система проверяет авторизован ли пользователь, если пользователь не авторизован, он переадресовывается на страницу авторизации. На странице авторизации пользователь должен видеть форму авторизации. Давайте сделаем её.
<html>
<head>
<title>Авторизация пользователей</title>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="" method="post">
<div class="row">
<label for="login">Ваш логин:</label>
<input type="text" class="text" name="login" id="login" />
</div>
<div class="row">
<label for="password">Ваш пароль:</label>
<input type="password" class="text" name="password" id="password" />
</div>
<div class="row">
<input type="submit" name="submit" id="btn-submit" value="Авторизоваться" />
</div>
</form>
<p class="to_reg">Если вы не зарегистрированы в системе, <a href="registration.php">зарегистрируйтесь</a>.</p>
</body>
</html>
Теперь нашей форме нужно придать некий вид. Заодно определим правила для других элементов. Я, забегая вперед, приведу содержимое таблицы стилей полностью.
/* файл style.css */
.row {
margin-bottom:10px;
width:220px;
}
.row label {
display:block;
font-weight:bold;
}
.row input.text {
font-size:1.2em;
padding:2px 5px;
}
.to_reg {
font-size:0.9em;
}
.instruction {
font-size:0.8em;
color:#aaaaaa;
margin-left:2px;
cursor:default;
}
.error {
color:red;
margin-left:3px;
}
Если всё сделано верно, у вас в броузере должно быть следующее:
Конечно же у нас нет пока ни одного зарегистрированного пользователя, и чтобы авторизоваться, нужно зарегистрироваться. Давайте сделаем форму регистрации.
<html>
<head>
<title>Регистрация пользователей</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="" method="post">
<div class="row">
<label for="login">Укажите ваш логин:</label>
<input type="text" class="text" name="login" id="login" value="<?=$fields['login'];?>" />
<div class="error" id="login-error"><?=$errors['login'];?></div>
<div class="instruction" id="login-instruction">В имени пользователя могут быть только символы латинского алфавита, цифры, символы '_', '-', '.'. Длина имени пользователя должна быть не короче 4 символов и не длиннее 16 символов</div>
</div>
<div class="row">
<label for="password">Напишите ваш пароль:</label>
<input type="password" class="text" name="password" id="password" value="" />
<div class="error" id="password-error"><?=$errors['password'];?></div>
<div class="instruction" id="password-instruction">В пароле вы можете использовать только символы латинского алфавита, цифры, символы '_', '!', '(', ')'. Пароль должен быть не короче 6 символов и не длиннее 16 символов</div>
</div>
<div class="row">
<label for="password_again">Повторите введенный пароль:</label>
<input type="password" class="text" name="password_again" id="password_again" value="" />
<div class="error" id="password_again-error"><?=$errors['password_again'];?></div>
<div class="instruction" id="password_again-instruction">Повторите введенный ранее пароль</div>
</div>
<div class="row">
<!-- Кнопка отправки данных формы -->
<input type="submit" name="submit" id="btn-submit" value="Зарегистрироваться" />
<!-- Кнопка сброса полей формы к исходному состоянию -->
<input type="reset" name="reset" id="btn-reset" value="Очистить" />
</div>
</form>
</body>
</html>
Вы, наверное, обратили внимание на то, что в HTML-коде присутствуют переменные PHP. Они являются содержимым атрибутов текстовых полей форм, содержимом контейнеров, предназначенных для вывода ошибок. Но мы не инициализировали эти переменные. Давайте сделаем это.
<?
// Инициализируем переменные для введенных значений и возможных ошибок
$errors = array();
$fields = array();
?>
<html>
<head>
<title>Регистрация пользователей</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="" method="post">
<div class="row">
<label for="login">Укажите ваш логин:</label>
<input type="text" class="text" name="login" id="login" value="<?=$fields['login'];?>" />
<div class="error" id="login-error"><?=$errors['login'];?></div>
<div class="instruction" id="login-instruction">В имени пользователя могут быть только символы латинского алфавита, цифры, символы '_', '-', '.'. Длина имени пользователя должна быть не короче 4 символов и не длиннее 16 символов</div>
</div>
<div class="row">
<label for="password">Напишите ваш пароль:</label>
<input type="password" class="text" name="password" id="password" value="" />
<div class="error" id="password-error"><?=$errors['password'];?></div>
<div class="instruction" id="password-instruction">В пароле вы можете использовать только символы латинского алфавита, цифры, символы '_', '!', '(', ')'. Пароль должен быть не короче 6 символов и не длиннее 16 символов</div>
</div>
<div class="row">
<label for="password_again">Повторите введенный пароль:</label>
<input type="password" class="text" name="password_again" id="password_again" value="" />
<div class="error" id="password_again-error"><?=$errors['password_again'];?></div>
<div class="instruction" id="password_again-instruction">Повторите введенный ранее пароль</div>
</div>
<div class="row">
<!-- Кнопка отправки данных формы -->
<input type="submit" name="submit" id="btn-submit" value="Зарегистрироваться" />
<!-- Кнопка сброса полей формы к исходному состоянию -->
<input type="reset" name="reset" id="btn-reset" value="Очистить" />
</div>
</form>
</body>
</html>
В атрибуте action тега form не указан параметр. В этом случае при отправке данных формы обрабатываться они будут в том же сценарии, из которого они и отправлялись. Значит нам нужно написать код, обрабатывающий данные формы. Но давайте сначала оговорим алгоритм их обработки.
Нам нужно, чтобы поля логина и пароля не были пустыми. Затем необходимо проверить логин на соответствие требованиям. Пароль также должен соответствовать описанным требованиям, а повторно указанный пароль должен с ним совпадать и, кроме того, они должны быть идентичны. Если какое-то из этих условий не выполняется, обработка данных формы должна быть прекращена, в массив сообщений об ошибке должно быть записано соответствующее оповещение, и оно должно быть отображено пользователю. Для удобства пользователя мы сохраним введенный им логин (если он его указал), записав его значение в массив $fields.
Если всё нормально, в окне вашего браузера, обратившись к документу registration.php, вы должны увидеть примерно такую форму:
Теперь, допустим, пользователь нажал на кнопку регистрации, не заполнил поля формы. Согласно нашему алгоритму, логин и пароль не могут быть пустыми. Если это условие не выполняется, регистрация невозможно. Мы помним о том, что обработка данных формы происходит в текущем сценарии. Значит нам нужно изменить его код, добавив соответствующие проверки. Сразу же оговорим и следующие проверки. Если введены и логин, и пароль, нужно проверить их соответствие указанным требованиям. Для проверки логина и пароля мы создадим пользовательские функции в файле functions.php.
/**
* functions.php
* Файл с пользовательскими функциями
*/
// Подключаем файл с параметрами подключения к СУБД
require_once('database.php');
// Проверка имени пользователя
function checkLogin($str) {
// Инициализируем переменную с возможным сообщением об ошибке
$error = '';
// Если отсутствует строка с логином, возвращаем сообщение об ошибке
if(!$str) {
$error = 'Вы не ввели имя пользователя';
return $error;
}
/**
* Проверяем имя пользователя с помощью регулярных выражений
* Логин должен быть не короче 4, не длиннее 16 символов
* В нем должны быть символы латинского алфавита, цифры,
* в нем могут быть символы '_', '-', '.'
*/
$pattern = '/^[-_.a-z\d]{4,16}$/i';
$result = preg_match($pattern, $str);
// Если проверка не прошла, возвращаем сообщение об ошибке
if(!$result) {
$error = 'Недопустимые символы в имени пользователя или имя пользователя слишком короткое (длинное)';
return $error;
}
// Если же всё нормально, вернем значение true
return true;
}
// Проверка пароля пользователя
function checkPassword($str) {
// Инициализируем переменную с возможным сообщением об ошибке
$error = '';
// Если отсутствует строка с логином, возвращаем сообщение об ошибке
if(!$str) {
$error = 'Вы не ввели пароль';
return $error;
}
/**
* Проверяем пароль пользователя с помощью регулярных выражений
* Пароль должен быть не короче 6, не длиннее 16 символов
* В нем должны быть символы латинского алфавита, цифры,
* в нем могут быть символы '_', '!', '(', ')'
*/
$pattern = '/^[_!)(.a-z\d]{6,16}$/i';
$result = preg_match($pattern, $str);
// Если проверка не прошла, возвращаем сообщение об ошибке
if(!$result) {
$error = 'Недопустимые символы в пароле пользователя или пароль слишком короткий (длинный)';
return $error;
}
// Если же всё нормально, вернем значение true
return true;
}
Теперь нам нужно изменить файл registration.php, чтобы задействовать объявленные нами функции. В сценарий мы добавим условие, проверяющее нажатие кнопки регистрации. Внутри этого условия запускается проверка логина и паролей. В случае, если какая-то из проверок завершается неудачей, мы вновь отображаем форму, и выводим сообщение об ошибке. Если ошибок нет, мы регистрируем пользователя, форму регистрации при этом уже не отображаем, сообщаем пользователю об успешной регистрации, и с помощью функции header() переадресовываем его к форме авторизации.
<?
/**
* registration.php
* Страница регистрации пользователей. Предполагается, что в вашей
* базе данных присутствует таблица пользователей users, в которой
* есть поля id, login, password, reg_date
*/
// Подключаем файл с пользовательскими функциями
require_once('functions.php');
// Инициализируем переменные для введенных значений и возможных ошибок
$errors = array();
$fields = array();
// Заранее инициализируем переменную регистрации, присваивая ей ложное значение
$reg = false;
// Если была нажата кнопка регистрации
if(isset($_POST['submit'])) {
// Делаем массив сообщений об ошибках пустым
$errors['login'] = $errors['password'] = $errors['password_again'] = '';
// С помощью стандартной функции trim() удалим лишние пробелы
// из введенных пользователем данных
$fields['login'] = trim($_POST['login']);
$password = trim($_POST['password']);
$password_again = trim($_POST['password_again']);
// Если логин не пройдет проверку, будет сообщение об ошибке
$errors['login'] = checkLogin($fields['login']) === true ? '' : checkLogin($fields['login']);
// Если пароль не пройдет проверку, будет сообщение об ошибке
$errors['password'] = checkPassword($password) === true ? '' : checkPassword($password);
// Если пароль введен верно, но пароли не идентичны, будет сообщение об ошибке
$errors['password_again'] = (checkPassword($password) === true && $password === $password_again) ? '' : 'Введенные пароли не совпадают';
// Если ошибок нет, нам нужно добавить информацию о пользователе в БД
if($errors['login'] == '' && $errors['password'] == '' && $errors['password_again'] == '') {
// Вызываем функцию регистрации, её результат записываем в переменную
$reg = registration($fields['login'], $password);
// Если регистрация прошла успешно, сообщаем об этом пользователю
// И создаем заголовок страницы, который выполнит переадресацию к форме авторизации
if($reg === true) {
$message = '<p>Вы успешно зарегистрировались в системе. Сейчас вы будете переадресованы к странице авторизации. Если это не произошло, перейдите на неё по <a href="login.php">прямой ссылке</a>.</p>';
header('Refresh: 5; URL = login.php');
}
// Иначе сообщаем пользователю об ошибке
else {
$errors['full_error'] = $reg;
}
}
}
?>
<html>
<head>
<title>Регистрация пользователей</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="" method="post">
<div class="row">
<label for="login">Укажите ваш логин:</label>
<input type="text" class="text" name="login" id="login" value="<?=$fields['login'];?>" />
<div class="error" id="login-error"><?=$errors['login'];?></div>
<div class="instruction" id="login-instruction">В имени пользователя могут быть только символы латинского алфавита, цифры, символы '_', '-', '.'. Длина имени пользователя должна быть не короче 4 символов и не длиннее 16 символов</div>
</div>
<div class="row">
<label for="password">Напишите ваш пароль:</label>
<input type="password" class="text" name="password" id="password" value="" />
<div class="error" id="password-error"><?=$errors['password'];?></div>
<div class="instruction" id="password-instruction">В пароле вы можете использовать только символы латинского алфавита, цифры, символы '_', '!', '(', ')'. Пароль должен быть не короче 6 символов и не длиннее 16 символов</div>
</div>
<div class="row">
<label for="password_again">Повторите введенный пароль:</label>
<input type="password" class="text" name="password_again" id="password_again" value="" />
<div class="error" id="password_again-error"><?=$errors['password_again'];?></div>
<div class="instruction" id="password_again-instruction">Повторите введенный ранее пароль</div>
</div>
<div class="row">
<!-- Кнопка отправки данных формы -->
<input type="submit" name="submit" id="btn-submit" value="Зарегистрироваться" />
<!-- Кнопка сброса полей формы к исходному состоянию -->
<input type="reset" name="reset" id="btn-reset" value="Очистить" />
</div>
</form>
</body>
</html>
В скрипте вы должны были заметить еще одну новую функцию —registration(). А мы её еще не объявляли. Давайте сделаем это.
// Функция регистрации пользователя
function registration($login, $password) {
// Инициализируем переменную с возможным сообщением об ошибке
$error = '';
// Если отсутствует строка с логином, возвращаем сообщение об ошибке
if(!$login) {
$error = 'Не указан логин';
return $error;
}
elseif(!$password) {
$error = 'Не указан пароль';
return $error;
}
// Проверяем не зарегистрирован ли уже пользователь
// Подключаемся к СУБД
connect();
// Пишем строку запроса
$sql = "SELECT `id` FROM `users` WHERE `login`='" . $login . "'";
// Делаем запрос к базе
$query = mysql_query($sql) or die("<p>Невозможно выполнить запрос: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
// Смотрим на количество пользователей с таким логином, если есть хоть один,
// возвращаем сообщение об ошибке
if(mysql_num_rows($query) > 0) {
$error = 'Пользователь с указанным логином уже зарегистрирован';
return $error;
}
// Если такого пользователя нет, регистрируем его
// Пишем строку запроса
$sql = "INSERT INTO `users`
(`id`,`login`,`password`) VALUES
(NULL, '" . $login . "','" . $password . "')";
// Делаем запрос к базе
$query = mysql_query($sql) or die("<p>Невозможно добавить пользователя: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
// Не забываем отключиться от СУБД
mysql_close();
// Возвращаем значение true, сообщающее об успешной регистрации пользователя
return true;
}
Если всё нормально, ваш пользователь будет зарегистрирован. Можете потестировать форму. Попробуйте зарегистрировать пользователей с одинаковыми логинами. После успешной регистрации пользователь будет переадресован к форме авторизации. Ранее мы просто создали разметку для отображения этой формы. Так как в её атрибуте action не указан никакой параметр, данные, отправленные формой, будут обрабатываться в этом же сценарии. Значит нам нужно написать код для обработки, и добавить его в документ login.php.
<?
/**
* Страница авторизации пользователей. Предполагается,
* что в вашей базе данных присутствует таблица users,
* в которой существуют поля id, login и password
*/
// Подлючаем файл с пользовательскими функциями
require_once('functions.php');
// Заранее инициализируем переменную авторизации, присвоив ей ложное значение
$auth = false;
// Если была нажата кнопка авторизации
if(isset($_POST['submit'])) {
// Делаем массив сообщений об ошибках пустым
$errors['login'] = $errors['password'] = $errors['password_again'] = '';
// С помощью стандартной функции trim() удалим лишние пробелы
// из введенных пользователем данных
$login = trim($_POST['login']);
$password = trim($_POST['password']);
// Авторизуем пользователя
// Вызываем функцию регистрации, её результат записываем в переменную
$auth = authorization($login, $password);
// Если авторизация прошла успешно, сообщаем об этом пользователю
// И создаем заголовок страницы, который выполнит переадресацию на защищенную
// от общего доступа страницу
if($auth === true) {
$message = '<p>Вы успешно авторизовались в системе. Сейчас вы будете переадресованы на главную страницу сайта. Если это не произошло, перейдите на неё по <a href="/">прямой ссылке</a>.</p>';
header('Refresh: 5; URL = /');
}
// Иначе сообщаем пользователю об ошибке
else {
$errors['full_error'] = $auth;
}
}
?>
<html>
<head>
<title>Авторизация пользователей</title>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<?
// Если запущен процесс авторизации, но она не была успешной,
// или же авторизация еще не запущена, отображаем форму авторизации
if($auth !== true) {
?>
<!-- Блок для вывода сообщений об ошибках -->
<div id="full_error" class="error" style="display:
<?
echo $errors['full_error'] ? 'inline-block' : 'none';
?>
;">
<?
// Выводим сообщение об ошибке, если оно есть
echo $errors['full_error'] ? $errors['full_error'] : '';
?>
</div>
<form action="" method="post">
<div class="row">
<label for="login">Ваш логин:</label>
<input type="text" class="text" name="login" id="login" />
</div>
<div class="row">
<label for="password">Ваш пароль:</label>
<input type="password" class="text" name="password" id="password" />
</div>
<div class="row">
<input type="submit" name="submit" id="btn-submit" value="Авторизоваться" />
</div>
</form>
<p class="to_reg">Если вы не зарегистрированы в системе, <a href="registration.php">зарегистрируйтесь</a>.</p>
<?
} // Закрывающая фигурная скобка условного оператора проверки успешной авторизации
// Иначе выводим сообщение об успешной авторизации
else {
print $message;
}
/**
* Если всё правильно, будет выведено сообщение об успешной авторизации,
* пользователь будет переадресован на защищенную страницу
*/
?>
</body>
</html>
Вы, наверное, заметили, что в скрипте авторизации у нас появилась ещё одна незнакомая функция — authorization(). Эта функция должна авторизовать пользователя, предварительно проверив, существует ли в базе данных зарегистрированный пользователь с таким логином и паролем. Если такой пользователь не будет найден, авторизация будет прервана, на экран будет выведено сообщение о неудаче. При успешной проверки функция authorization() запустит сессию, и запишет в неё значения логина и пароля пользователя, сообщит сценарию об успешности авторизации, и сценарий перенаправит пользователя на защищенную страницу ресурса.
/**
* Функция авторизации пользователя.
* Авторизация пользователей у нас будет осуществляться
* с помощью сессий PHP.
*/
function authorization($login, $password) {
// Инициализируем переменную с возможным сообщением об ошибке
$error = '';
// Если отсутствует строка с логином, возвращаем сообщение об ошибке
if(!$login) {
$error = 'Не указан логин';
return $error;
}
elseif(!$password) {
$error = 'Не указан пароль';
return $error;
}
// Проверяем не зарегистрирован ли уже пользователь
// Подключаемся к СУБД
connect();
// Нам нужно проверить, есть ли такой пользователь среди зарегистрированных
// Составляем строку запроса
$sql = "SELECT `id` FROM `users` WHERE `login`='".$login."' AND `password`='".$password."'";
// Выполняем запрос
$query = mysql_query($sql) or die("<p>Невозможно выполнить запрос: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
// Если пользователя с такими данными нет, возвращаем сообщение об ошибке
if(mysql_num_rows($query) == 0) {
$error = 'Пользователь с указанными данными не зарегистрирован';
return $error;
}
// Если пользователь существует, запускаем сессию
session_start();
// И записываем в неё логин и пароль пользователя
// Для этого мы используем суперглобальный массив $_SESSION
$_SESSION['login'] = $login;
$_SESSION['password'] = $password;
// Не забываем закрывать соединение с базой данных
mysql_close();
// Возвращаем true для сообщения об успешной авторизации пользователя
return true;
}
Когда пользователь попадает на защищенную страницу, следует проверить корректность данных о его авторизации. Для этого нам потребуется еще одна пользовательская функция. Назовем её checkAuth(). Её задачей будет сверка данных авторизации пользователя с теми, которые хранятся в нашей базе. Если данные не совпадут, пользователь будет перенаправлен на страницу авторизации.
function checkAuth($login, $password) {
// Если нет логина или пароля, возвращаем false
if(!$login || !$password) return false;
// Проверяем зарегистрирован ли такой пользователь
// Подключаемся к СУБД
connect();
// Составляем строку запроса
$sql = "SELECT `id` FROM `users` WHERE `login`='".$login."' AND `password`='".$password."'";
// Выполняем запрос
$query = mysql_query($sql) or die("<p>Невозможно выполнить запрос: " . mysql_error() . ". Ошибка произошла в строке " . __LINE__ . "</p>");
// Если пользователя с такими данными нет, возвращаем false;
if(mysql_num_rows($query) == 0) {
return false;
}
// Не забываем закрывать соединение с базой данных
mysql_close();
// Иначе возвращаем true
return true;
}
Теперь, когда пользователь попал на защищенную страницу, мы должны вызвать функцию проверки данных авторизации. Сценарий вызова и проверки мы поместим в отдельный файл checkAuth.php и будем подключать его к тем страницам, которые будут закрытыми для общего доступа.
/**
* Скрипт проверки авторизации пользователей
*/
// Запускаем сессию, из которой будем извлекать логин и пароль
// авторизовавшихся пользователей
session_start();
// Подлючаем файл с пользовательскими функциями
require_once('functions.php');
/**
* Чтобы определить авторизован ли пользователь, нам нужно
* проверить существуют ли в базе данных записи для его логина
* и пароля. Для этого воспользуемся пользовательской функцией
* проверки корректности данных авторизовавшегося пользователя.
* Если эта функция вернет false, значит авторизации нет.
* При отсутствии авторизации мы просто переадресовываем
* пользователя к странице авторизации.
*/
// Если в сессии присуствуют данные и о логине, и о пароле,
// проверяем их
if(isset($_SESSION['login']) && $_SESSION['login'] && isset($_SESSION['password']) && $_SESSION['password']) {
// Если проверка существующих данных завершается неудачей
if(!checkAuth($_SESSION['login'], $_SESSION['password'])) {
// Переадресовываем пользователя на страницу авторизации
header('location: login.php');
// Прекращаем выполнение скрипта
exit;
}
}
// Если данных либо о логине, либо о пароле пользователя нет,
// считаем что авторизации нет, переадресовываем пользователя
// на страницу авторизации
else {
header('location: login.php');
// Прекращаем выполнение сценария
exit;
}
А теперь давайте создадим код нашей защищенной страницы. Он будет довольно-таки прост.
<?
/**
* Защищенная страница. К ней возможен доступ только авторизованным
* пользователям. Если пользователь не авторизован, ему предлагается
* авторизоваться, и доступ к сайту ограничивается.
*/
require_once('checkAuth.php');
?>
<html>
<head>
<title>Авторизация и регистрация пользователей</title>
</head>
<body>
<h1>Успешная авторизация.</h1>
<p>Вы получили доступ к защищенной странице. Вы можете <a href="logout.php">выйти</a> из системы.</p>
</body>
</html>
Как видите, в защищенном документе мы подключаем только один файл — checkAuth.php. Все остальные файлы подключаются уже в других сценариях. Поэтому наш код не выглядит громоздким. Регистрацию и авторизацию пользователей мы организовали. Теперь необходимо позволить пользователям выходить из системы. Для этого мы создадим сценарий в файле logout.php.
/**
* Скрипт выхода пользователя из системы. Так как пользователи
* авторизуются через сессии, их логин и пароль хранятся
* в суперглобаном массиве $_SESSION. Чтобы осуществить
* выход из системы, достаточно просто уничтожить значения
* массива $_SESSION['login'] и $_SESSION['password'], после
* чего мы переадресовываем пользователя к странице авторизации
*/
// Обязательно запускаем сессию
session_start();
unset($_SESSION['login']);
unset($_SESSION['password']);
header('location: login.php');
Скрипт регистрации, авторизации и проверки пользователей готов. Вы можете использовать его у себя, дополнять, изменять под ваши нужды. Если у вас будут вопросы, можете задавать их в комментариях. Вы можете скачать себе все файлы, о которых здесь велась речь, упакованные в один архив.
P.S. Я в курсе, что лучше писать объектно-ориентированный код, знаю, что передавать и хранить пароль в открытом виде не стоит, что информацию, заносимую в базу данных, необходимо предварительно проверять. Знаю. Об этом я здесь не буду говорить.
- Я опубликовал эту статью:01.08.2013
- 99 643