главная :: основы PHP
Заголовок
Аутентификация с несколькими пользователями
Хотя вариант, приведенный в листинге 16.4, неплохо подходит для небольших статических групп пользователей, для ограничения доступа к
некоторым областям web-сайта обычно выбираются более гибкие и надежные решения. Вероятно, вы предпочтете создать отдельные имя и
пароль для каждого пользователя, которому предоставляется расширенный доступ. Существует несколько реализаций этой схемы, из которых
чаще всего встречается чтение аутентификационных данных из текстового файла или базы данных.
Хранение информации в текстовом файле
Существует очень простое, но эффективное решение — хранить аутентификацион-ные данные в текстовом файле. В каждой строке файла
содержится отдельная пара «имя:пароль»; в,процессе проверки программа последовательно читает и проверяет все строки файла. Примерный
вид текстового файла приведен в листинге 16.5.
Листинг 16.5. Типичный текстовый файл с параметрами аутентификации (authenticate.txt)
brian:snaidni00
alessia:aiggaips
gary:9avaj9
chris:poghsawcd
matt:tsoptaes
Как видно из листинга, каждая строка приведенного файла состоит из имени пользователя и пароля, разделенных двоеточием (:). Таким
образом, при использовании этого файла существует пять комбинаций «имя/пароль», обеспечивающих доступ к ограниченным ресурсам.
Каждый раз, когда пользователь вводит имя и пароль в окне, сценарий открывает текстовый файл и последовательно ищет в нем
совпадающую пару. Если совпадение находится, запрашиваемый доступ пользователю предоставляется, а если нет — запрос отклоняется.
Процедура аутентификации продемонстрирована в листинге 16.6.
Листинг 16.6. Аутентификация на основе текстового файла
$file = "Listing16-5.txt":
$fp = fopen($file, "r"):
$auth_file = fread ($fp, filesize($fp)):
fclose($fp);
$authorized = 0;
// Сохранить строки файла в виде элементов массива
$elements = explode ("\n", $auth_file);
foreach ($elements as $element) {
list ($user, $pw) = split (":", $element);
if (($user == $PHP_AUTH_U$ER) && ($pw = $PHP_AUTH_PW)) :
$authorized = 1;
break ;
endif;
}
if (! $authorized) :
header('WWW-Authenticate: Basic realm="Secret Family Recipes'");
header('HTTP/1.0 401 Unauthorized');
print "You are attempting to enter a restricted area. Authorization is required.";
exit;
else :
print "Welcome to the family's secret recipe collection";
endif;
?>
Хранение информации в базе данных
Хранение аутентификационной информации в базах данных обладает рядом преимуществ, многие из которых рассматривались в главе 11.
Простота обновления, масштабируемость и гибкость — лишь некоторые из доводов в пользу хранения больших объемов информации в базе
данных. В табл. 16.4 приведено содержимое демонстрационной таблицы user_authenticate. После успешно пройденной аутентификации по
идентификатору пользователя можно устанавливать связи с другими таблицами, содержащими разнообразные данные и настройки. Процесс
разделения взаимосвязанных данных по таблицам меньшего размера (вместо группировки всей информации в одной большой таблице)
называется нормализацией базы данных, о нем кратко говорилось в главе 11.
В примерах этого раздела используется синтаксис MySQL. Программный код достаточно прост и легко адаптируется для других
СУБД.
Таблица 16.4. Пример таблицы с аутентификационными данными (user_authenticate)
userid
username
password
url234
brian
2b877b4b825b48a9a0950dd5bdlf264d
urlHS
alessia
6fled002ab5595859014ebf0951522d9
url15932
gary
122a2aladf096fe4f93287f9dal8f664
url19042
chris
6332e88a4c7dba6f7743d3a7a0c6ea2c
url8930
matt
922fe5dl40el9d308f2037404a0536a
Программа, приведенная в листинге 16.7, сначала проверяет, было ли присвоено значение переменной $PHP_AUTH_USER. Если значение не
присвоено, выводится окно для ввода необходимой информации. В противном случае программа создает соединение с сервером MySQL и
ищет в таблице user_authenticate имя и пароль, введенные пользователем. При отсутствии совпадения окно аутентификации выводится заново,
а если проверка дает положительный результат, переменной $user_id присваивается идентификатор пользователя.
Листинг 16.7. Аутентификация пользователя посредством поиска в базе данных
if (!isset($PHP_AUTH_USER)) :
header( 'WWW-Authenticate: Basic realm="Secret Family Recipes'");
header('HTTP/1.0 401 Unauthorized');
exit;
else :
// Создать содинение с базой данных MySQL
mysql_connect ("host", "user", "password")
or die ("Can't connect to database!");
mysql_select_db ("useMnfo")
or die ("Can't select database!");
// Обратиться к таблице user_authenticate
// для поиска совпадающей строки
$query = "select userid from user_authenticate where
username = '$PHP_AUTH_USER' and
password = '$PHP_AUTH_PW'";
$result = mysql_query (Squery):
// Если совпадение не найдено, вывести окно аутентификации
if (mysql_numrows($result) != 1) :
header('WWW-Authenticate: Basic realm="Secret Family Recipes'");
header ('HTTP/ 1.0 401 Unauthorized');
exit;
// Если проверка пройдена, получить идентификатор пользователя
else ;
Suserid = mysql_result (user_authenticate, 0, $result);
endif;
endif;
?>
|