Модуль аутентификации пользователей содержит четыре главных элемента: регистрацию пользователей, вход и выход из системы, смену паролей и переустановку паролей. Рассмотрим все элементы поочередно.
Регистрация
Чтобы зарегистрировать пользователя, необходимо через форму получить сведения о нем и поместить их в базу данных.
Когда пользователь выполняет щелчок на ссылка Зарегистрироваться, которая находится на странице login.php? для него выводится форма регистрации, сгенерированная сценарием register_form.php. Код этого сцернария смотрите в листинге.
register_form.php — эта форма дает пользователям возможность зарегистрироваться в системе ABCMemori
<?php
require_once('bookmark_fns.php');
$title ="Регистрация пользователей";
$description = "Регистрация пользователей";
$keywords = "регистрация пользователей";
do_html_header($title, $description, $keywords);
blok_left();
?>
<div id="blok_right">
<div class="blok_text" >
<div class="register" align="left">
<?php
do_html_heading($title);
display_registration_form
();?>
</div></div></div>
<?php
do_html_footer();
?>
Эта страница также довольно проста и осуществляет лишь вызов функций из библиотеки вывода — output_ fns.php. Вывод сценария показан на рисунке.
Форма серого цвета на этой странице представляет собой вывод функции display_registration_form(), которая содержится в файле output_fhs.php. Когда пользователь выполняет щелчок на кнопке Регистрация, выполняется сценарий register_new.php, показанный в листинге.
register_new.php — этот сценарий проверяет допустимость вводимой пользователем информации и помещает ее в базу данных
<?php
// Включить файлы функций для данного приложения
require_once('bookmark_fns.php');
// Создать короткие имена переменных
$email=$_POST['email'];
$username=$_POST['username'];
$passwd=$_POST['passwd'];
$passwd2=$_POST['passwd2'];
// Запустить сеанс, который может потребоваться позже.
// Его следует запустить сейчас, поскольку он должен
// находиться перед заголовками.
session_start();
try
{
// Проверить, заполнены ли поля формы
if (!filled_out($_POST))
{
throw new Exception('Вы не заполнили корректно форму. Пожалуйста, '
.'вернитесь на форму и повторите попытку.');
}
// Недопустимый адрес электронной почты
if (!valid_email($email))
{
throw new Exception('Недопустимый адрес электронной почты. Пожалуйста, '
.'вернитесь на форму и повторите попытку.');
}
// Несовпадающие пароли
if ($passwd != $passwd2)
{
throw new Exception('Введенные пароли не совпадают. Пожалуйста, '
.'вернитесь на форму и повторите попытку.');
}
// Проверить длину пароля.
if (strlen($passwd) < 6)
{
throw new Exception('Пароль должен иметь не менее 6 символов. '
.'Пожалуйста, вернитесь на форму и повторите попытку.');
}
// Проверить длину имени пользователя.
if (strlen($username) > 16)
{
throw new Exception('Имя пользователя должно иметь не более 16 символов.'
.' Пожалуйста, вернитесь на форму и повторите попытку.');
}
// Предпринять попытку регистрации. Эта функция также может
// сгенерировать исключение
register($username, $email, $passwd);
// Зарегистрировать переменную сеанса
$_SESSION['valid_user'] = $username;
// Вывести ссылку на страницу, предназначенную для
// зарегистрированных пользователей
$title = "Успешная регистрация";
$description = "Успешная регистрация";
$keywords = "Успешная регистрация";
do_html_header($title, $description, $keywords);
blok_left();
echo'<div id="blok_right">';
echo '<div class="blok_text">';
echo'<div class="text_top" align=left>';
do_html_heading($title);
echo '<br><br>';
echo 'Ваша регистрация прошла успешно. Переходите на страницу '
.'для зарегистрированных пользователей '
.'и приступайте к созданию закладок!';
do_html_url('member.php',
'Перейти на страницу для зарегистрированных пользователей');
echo '</div></div></div>';
// Конец страницы
do_html_footer();
}
catch(Exception $e)
{
$title = "Проблема";
$description = "Проблема";
$keywords = "проблема";
do_html_header($title, $description, $keywords);
blok_left();
echo'<div id="blok_right">';
echo '<div class="blok_text">';
echo'<div class="text_top" align=left>';
do_html_heading($title);
echo $e->getMessage();
echo '</div></div></div>';
do_html_footer();
exit;
}
?>
Это первый более-менее сложный сценарий, с которым мы встретились в данном приложении. Он начинается с подключения файлов функций и запуска сеанса. (После регистрации пользователя создается переменная сеанса, содержащая имя пользователя, как это было рассмотрено ЗДЕСЬ).
Тело сценария помещено в блок try, поскольку выполняется проверка множества условий. Если какое-то из условий завершается неудачно, выполнение переходит на блок catch, который мы рассмотрим дальше.
Затем осуществляется проверка допустимости данных, введенных пользователем. Нам необходимо выполнить множество проверок:
- Проверить, что форма полностью заполнена. Для этого применяется функция filled_out ():
if ( !filled_out ( $_POST ) )
Эту функцию мы написали самостоятельно. Она содержится в библиотеке data_valid_fns.php и будет рассматриваться чуть позже.
- Проверка допустимости предоставленного адреса электронной почты:
if (valid_email ($email))
Эта функция написана нами и содержится в библиотеке data_valid_fns.php.
- Проверить эдентичность обоих вариантов пароля, введенных пользователем:
if ($passwd !+ $passwd2)
- Проверить имя пользователя и пароль на допустимую длину:
if (strlen ($passwd) < 6)
и
if (strlen ($passwd2) > 16)
В нашем примере длина пароля должна составлять не менее шести символов, чтобы его было сложнее угадать, но более 16 символов, чтобы он помещался в базе данных. Обратите внимание, что максимальная длина пароля ничем не ограничивается, поскольку в базе данных хранится его кэш-значение SH1, длина которого всегда 40 символов вне зависимости от длины исходного пароля.
Функция filled_out() библиотеки data_valid_fns.php — эта функция проверяет, заполнена ли форма
function filled_out($form_vars)
{
// Проверить, что каждая переменная имеет значение
foreach ($form_vars as $key => $value)
{
if (!isset($key) || ($value == ''))
return false;
}
return true;
}
Функция valid_email() библиотеки data_valid_fns.php — эта функция проверяет допустимость адреса электронной почты
function valid_email($address)
{
// Проверить допустимость адреса электронной почты
if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))
return true;
else
return false;
}
Функция filled_out () ожидает получить массив переменных — в общем случае таковым может быть $_POST или $_GET. Если массив заполнен, функция возвращает true, а в противном случае — false.
В функции valid_email () для проверки адресов электронной почты применяется несколько более сложное регулярное выражение, чем то, которое было предложено ранее. Если адрес является допустимым, функция возвращает значение true, в противном случае — false.
После проверки введенных пользователем данных можно предпринять попытку зарегистрировать пользователя.
register($username, $email, $passwd);<
/p>
// Зарегистрировать переменную сеанса
$_SESSION['valid_user'] = $username;
// Вывести ссылку на страницу, предназначенную для
// зарегистрированных пользователей
$title = "Успешная регистрация";
$description = "Успешная регистрация";
$keywords = "Успешная регистрация";
do_html_header($title, $description, $keywords);
blok_left();
echo'<div id="blok_right">';
echo '<div class="blok_text">';
echo'<div class="text_top" align=left>';
do_html_heading($title);
echo '<br><br>';
echo 'Ваша регистрация прошла успешно. Переходите на страницу '
.'для зарегистрированных пользователей '
.'и приступайте к созданию закладок!';
do_html_url('member.php',
'Перейти на страницу для зарегистрированных пользователей');
echo '</div></div></div>';
// Конец страницы
do_html_footer();
Несложно заметить, что мы просто вызываем функцию register () и передаем ей имя пользователя, адрес электронной почты и пароль, которые были введены в форме регистрации. В случае успешного исхода мы регистрируем имя пользователя как переменную сеанса и выводим ссылку на главную страницу зарегистрированных пользователей. Если регистрация завершится неудачей, эта функция сгенерирует исключение, которое будет перехвачено блоком catch. Вывод сценария показан на рисунке.
Функция register () находится во включенной библиотеке user_auth_fns.php.
Функция register() библиотеки user_auth_fns.php — предпринимает попытку ввода информации о новом пользователе в базу данных
function register($username, $email, $password)
// Регистрирует нового пользователя в базе данных.
// Возвращает либо true, либо сообщение об ошибке.
{
// Подключиться к базе данных
$conn = db_connect();
// Проверить, уникально ли имя пользователя
$result = $conn->query("select * from user where username='$username'");
if (!$result)
throw new Exception('Невозможно выполнить запрос к БД');
if ($result->num_rows > 0)
throw new Exception('Это имя пользователя уже занято - вернитесь '
.'на форму регистрации и выберите другое имя.');
// Если все в порядке, сохранить информацию в БД
$result = $conn->query("insert into user values
('$username', sha1('$password'), '$email')");
if (!$result)
throw new Exception('Невозможно сохранение в БД - пожалуйста, '
.'попытайтесь позже.');
return true;
}
Эта функция не содержит ничего нового — она осуществляет подключение к созданной ранее базе данных. Если выбранное имя пользователя уже задействовано либо база данных не может быть обновлена, функция возвращает значение false. В противном случае база данных обновляется и возвращается значение true.
Заметим, что подключение к базе данных реализуется через написанную ранее функцию db_coimect(). Она просто предоставляет единственную область хранения имени пользователя и пароля для подключения к базе данных. Таким образом, для изменения пароля базы данных достаточно модернизировать один файл приложения.
Функция db_connect() библиотеки db_fns.php - выполняет подключение к базе данных MySQL
function db_connect()
{
$result = new mysqli('localhost', 'root', 'tktyf', 'bookmarks');
if (!$result)
throw new Exception('Невозможно подключиться к серверу баз данных');
else
return $result;
}
Зарегистрированные пользователи могут входить и выходить из системы через обычные страницы, предназначенные для этих целей. Они будут разработаны в следующих разделах.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться