МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Практическая работа 8 Тема 4/2. Создание системы авторизации пользователей электронного портала Цель — освоить технологию создания системы авторизации пользователей электронного портала с хранением учетных данных в базе данных. Задание: 1. Дополнить таблицу пользователей учебной базы данных полями для хранения учетных данных. 2. Создать скрипт самостоятельной регистрации пользователей. 3. Реализовать доступ к списку книг учебного Web-ресурса пользователей, прошедших аутентификацию. Технология выполнения 8.1. Дополнение таблицы пользователей полями для хранения учетных данных При помощи phpMyAdmin в учебной базе данных библиотеки в таблицу читателей добавить два поля — login и passwd. Тип данных для обоих полей — varchar длиной 20 символов для login и 32 символа для passwd (так как в этом поле будет храниться хеш-функция пароля длиной 32 символа). На рис. 8.1 приведена исходная структура таблицы READAR. Рис. 8.1. Пример интерфейса управления структурой таблицы READER В нижней части интерфейса при помощи окна Add и кнопки Пошел можно добавить требуемое количество полей (в примере — 2). После выбора места вставки новых полей: в конец таблицы, в начало таблицы или после конкретного поля, и нажатия кнопки Пошел, выводится форма для назначения параметров новых полей — их имен и типов (рис. 8.2). 1 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 8.2. Пример формы для назначения параметров новых полей таблицы READER Для сохранения введенных значений требуется нажать кнопку Сохранить. После этого будет выведена структура таблицы READER с дополнительными полями (рис. 8.3). Рис. 8.3. Пример структуры дополненной таблицы READER Следует обратить внимание, что в phpMyAdmin любые операции с базой данных сопровождаются выводом генерируемого кода как в виде SQL-запроса (см. верхнюю часть рис. 8.3), так и в виде PHP-кода. Для просмотра PHP-кода следует нажать на гиперссылку Создать PHP-код (рис. 8.4). 2 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 8.4. Пример PHP-кода запроса на изменение структуры таблицы READER Таким образом, phpMyAdmin можно использовать в качестве наглядного учебного пособия по синтаксису запросов к базе данных на языке PHP. Если в таблице READER поле NUM_READER не было автоинкрементным, то следует сделать его таковым: в режиме редактирования этого поля удалить значение по умолчанию 0 и в поле дополнительно выбрать значение auto_increment (рис. 8.5). Рис. 8.5. Пример назначения типа поля auto_increment Если MySql выдал ошибку, то следует удалить все записи из таблицы READER и повторить попытку создания поля auto_increment (ошибка может возникнуть, если в поле NUM_READER есть непоследовательные данные). 8.2. Создание скрипта самостоятельной регистрации пользователей В корневом каталоге учебного Web-ресурса (каталог /www) создать файл index.php, который будет исполняться Web-сервером при обращении к этому ресурсу любого посетителя и формировать стартовую страницу. В этом файле разместить пункт Регистрация, с которого создать гиперссылку на регистрационную форму для назначения логина и пароля (код формы разместить в этом же файле) (рис. 8.6). Код гиперссылки может быть примерно таким: <a href="index.php?reg=1">Регистрация</a> 3 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Переданный в этой ссылке параметр reg имеет значение 1 и доступен через массив $_GET["reg"], например при помощи следующего PHP-кода: <? if (@$_GET['reg']==1) print регистрационной формы рис.6'; 'здесь находиться HTML код ?> Рис. 8.6. Пример регистрационной формы Логин и пароль вводятся самим пользователем в ходе его регистрации при помощи этой формы. В регистрационной форме могут быть и другие поля, соответствующие полям таблицы READER. Данные из регистрационной формы передаются через массив $_POST в функцию, при помощи которой они должны заноситься в таблицу читателей. Следует понимать: чтобы пользователь мог регистрироваться, ему необходимо поставить в соответствие пользователя MySql c привилегией insert (записи данных в базу). С целью защиты базы паролей в поле пароля (passwd) таблицы READER записывается не сам пароль, а его хеш-функция, получаемая при помощи функции md5($_POST["passwd"]), где passwd — имя поля ввода пароля регистрационной формы. Функция записи в таблицу также должна находиться в файле index.php. 8.3. Реализация доступа к списку книг учебного Webресурса пользователей, прошедших аутентификацию Для доступа зарегистрированного читателя к пользовательскому интерфейсу (в качестве которого можно использовать список книг библиотеки) в файле index.php следует разместить еще один пункт Вход для зарегистрированных пользователей, с которого создать гиперссылку на Web-страницу со списком книг. Список книг следует реализовать в новом файле, например, book.php в виде таблицы, как представлено на рис. 8.7. Таблица формируется по результату соответствующего запроса к базе данных. 4 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 8.7. Пример Web-страницы со списком книг Чтобы реализовать доступ к этой странице стандартными средствами Webсервера (при помощи окна, представленного на рис. 8.8) в защищаемых интерфейсах прописывается функция передачи браузеру соответствующего заголовка, состоящая из следующего кода: header('WWW-Authenticate: Basic realm=\"Защищаемая header("HTTP/1.0 401 Unauthorized"); Рис. 8.8. Пример формы для ввода учетных данных пользователя 5 область\"'); МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Из формы рис. 8.8 имя пользователя (логин) и пароль передаются соответственно через переменные $PHP_AUTH_USER и $PHP_AUTH_PW. Остается только сравнить введенные логин и пароль с учетными данными, хранимыми в базе данных и в случае их совпадения открыть пользователю соответствующий интерфейс. Следует помнить, что в базе хранятся хеш-функции паролей, поэтому для введенного пароля перед сравнением необходимо применить функцию md5(). Например, для реализации защиты каждая страница закрытой территории подключает файл с таким кодом: $result = mysql_query(" SELECT * FROM READER WHERE login='". preg_replace("/[^\\w_-]/","",$PHP_AUTH_USER). "' AND passwd='". md5($PHP_AUTH_PW). "'"); if (@mysql_num_rows($result)!=1) { header("WWW-Authenticate: Basic realm=\"User area\""); header("HTTP/1.0 401 Unauthorized"); print("Чтобы войти в пользовательскую часть сайта, надо ввести имя и пароль."); exit(); }; $user_row = mysql_fetch_array($result); В первой строке из логина удаляются все символы, кроме букв, цифр, тире и символа подчеркивания. Затем проверяется количество полученных строк, и только если это одна строка, дается доступ. В остальных случаях пользователь увидит в браузере окно, предлагающее ввести логин и пароль. Если же пользователь вошел успешно, в массиве $user_row мы имеем всю информацию о нем. Задание на самостоятельную работу Создать отдельный PHP-файл, выводящий HTML-страницу с персональными данными пользователя для их редактирования этим пользователем. Допуск к этой странице реализовать только для пользователей, прошедших аутентификацию. PHP-код, реализующий аутентификацию пользователей, целесообразно вынести в отдельный файл и подключать его к защищаемым файлам при помощи оператора include(). 6