В наших попытках мы возьмем за данность, что на вашем сервере установлено самое популярное ныне программное обеспечение: веб-сервер Apache, компилятор PHP 4 и система управления базами данных MySQL.
Базовая аутентификация Apache
Самый простой способ, не требующий практически никаких усилий от администратора — базовая аутентификация средствами сервера Apache. Для этого нужно сначала создать файл с паролями с помощью утилиты htpasswd, которая находится в каталоге bin сервера. Допустим, вы хотите закрыть паролем раздел /redir.php?url=test.auth%2Fbase%2F%2C который соответствует локальному каталогу /usr/home/test.auth/www/base/. Для этого вводим команду:
htpasswd -c /usr/home/test.auth/www/base/passwords admin
Команда создаст новый файл с паролями и внесет туда пользователя admin, пароль для которого вас попросят ввести здесь же.
После этого вам нужно создать файл конфигурации .htpasswd, в котором вы дадите понять системе, что нужно разрешить вход в каталог определенному пользователю, обозначенному в вашем файле:
AuthType Basic
AuthName «Область для Избранных»
AuthUserFile /usr/home/test.auth/www/base/passwords
Require user admin
Теперь, если вы попробуете войти в защищенную область, система попроcит вас ввести имя и пароль. А в поле Require user после пользователя admin через пробел можно добавить еще несколько пользователей, которым будет дан доступ в закрытую область. Вроде бы все работает, но это примитивный способ аутентификации: вы не можете закончить работу, сессия обрывается только после закрытия браузера, а также никак не можете разграничивать права пользователей просто потому, что вы их не знаете. Ниже мы предлагаем вам более продвинутый метод авторизации.
Базовая аутентификация с использованием базы данных
Способ, который сейчас будет описан, во много раз удобнее и лучше предыдущего. Он позволит как впускать только нужных пользователей, так и разграничивать их права, менять пароли и любую личную информацию. Но для этого вам придется разобраться с базой данных MySQL.
Здесь мы не станем рассказывать, как работать с MySQL, потому что этому были посвящены другие материалы на этом сайте. Давайте создадим таблицу users c полями «login», «password» и «fio», после чего добавим в нее несколько записей. Только не забывайте пароль добавлять в виде зашифрованной (MD5) строки. Эти операции удобно производить с помощью системы phpMyAdmin, которая в большинстве случаев установлена на вашем хостинге. После этого на каждую защищаемую страницу (или в файл шаблона) нужно добавить следующие строки:
<?
mysql_connect('localhost', 'root');
mysql_select_db('user');
$result = mysql_query("SELECT * FROM users WHERE login='". $PHP_AUTH_USER. "' AND password='". md5($PHP_AUTH_PW). "'");
if (@mysql_num_rows($result)!=1) {
header("WWW-Authenticate: Basic realm=\"Для избранных\"");
header("HTTP/1.0 401 Unauthorized");
print("Чтобы войти в пользовательскую часть сайта, надо ввести имя и пароль.");
print "
login: ".$PHP_AUTH_USER."
password: ".$PHP_AUTH_PW."
md5: ".md5($PHP_AUTH_PW);
exit();
};
$user_row = mysql_fetch_array($result);
echo «Здравствуйте, ».$user_row['fio']."!";
?>
Данная конструкция определит пользователя, возьмет из базы его имя и «поздоровается» с ним. Разумеется, целью нашей аутентификации было не проявление вежливости, но дальше уже можно делать все, что угодно: определять права пользователя на данный файл (эту информацию тоже можно вписать в базу и брать ее оттуда), отправлять его на личную страницу и так далее. Перед вами открываются все возможности работы с PHP и MySQL. При этом пароль в базе не хранится в открытом виде, и даже в случае кражи зашифрованной строки, подобрать его будет практически невозможно. Средствами PHP можно организовать процедуру изменения личной информации самим пользователем, а администратором, соответственно, всех пользователей. Однако это не тема нашего материала, и заострять внимание на этих операциях мы не станем.
Аутентификация с помощью Cookies
В то время как пользователь заходит на ваш сервер, вы имеете возможность положить к нему на компьютер маленький файл, называемый «Cookie». В другой раз вы сможете скачать его обратно и просмотреть записанную в нем информацию. Это часто используется для того, чтобы «узнавать» пользователя по имени во время разных заходов на сайт. Но наша задача несколько сложнее — нам нужно обеспечить не только «узнавание» пользователя, но и реализовать на основе «cookies» весь механизм аутентификации. Начнем с планирования.
Сразу объясним, что с помощью этого метода мы сможем избавиться от стандартной формы ввода логина и пароля и реализовать все в красивую формочку, аккуратно вписанную в дизайн вашего сайта. После ввода логина и пароля в нее и нажатия кнопки «Submit» пользователю будет отправлен «cookie» c логином и паролем. После этого при входе на каждую защищенную страницу этот файл будет скачиваться, и с помощью MySQL проверяться правильность данных. Разумеется, так как «cookie» — это такой же файл, как и остальные на компьютере пользователя, его можно украсть и прочесть в нем пароль. Поэтому мы должны шифровать его — например, знакомым нам ключом MD5. Правда, и в этом случае будет вероятность кражи «cookie», но если мы сделаем время ее жизни небольшое, а еще лучше, если будем выдавать при каждом входе на страницу новую, то вероятность взлома будет минимальна. В последнем случае нужно будет, разумеется, к паролю добавлять время, чтобы шифрованная строка была все время разной. Мы осуществим только первую часть плана — будем записывать в «cookie» зашифрованный пароль, в большинстве случаев этого будет вполне достаточно.
Ниже идет код php-скрипта, который будет принимать из формы логин и пароль. Они соответственно располагаются в переменных login и password. Задача скрипта проверить правильность ввода данных и выдать пользователю соответствующий «cookie». Кстати, добавьте в вашу базу данных еще одно поле — lastlogin, в нем мы будем хранить время последнего обращения к сайту.
<?
mysql_connect('localhost', 'root');
mysql_select_db('user');
$login_result = mysql_query("SELECT login FROM users WHERE login='$login' AND password='". md5($password). "'");
if (!mysql_error() && @mysql_num_rows($login_result)==1) {
setcookie(oursitelogin, $login, time()+1800, $COOKIE_PATH);
setcookie(oursitepass, md5($password), time()+1800, $COOKIE_PATH);
header("Location: /cookie/index2.php");
exit;
}
elseif (!mysql_error()) {
print ("Неправильный логин или пароль.");
}
else
print (mysql_error());
?>
После этого в каждом защищаемом файле нужно добавить код, который будет проверять правильность пароля, хранимого в «cookie» у пользователя. Если у него нет такого файла, или данные в нем неверны, то посетителя направят на страницу ввода пароля.
<?
mysql_connect('localhost', 'root');
mysql_select_db('user');
$login = $HTTP_COOKIE_VARS['oursitelogin'];
$login_result = mysql_query("SELECT login FROM users WHERE login='$login' AND password='$HTTP_COOKIE_VARS[oursitepass]'");
if (!mysql_error() && @mysql_num_rows($login_result)!=1) {
header("Location: /");
exit;
}
else
print (mysql_error());
print "Вы авторизованы!";
?>
Для того чтобы завершить сессию, пользователь должен нажать на кнопку, которая удалит cookie-файлы и перезагрузит текущую страницу.
Аутентификация с использованием сессий
На низком уровне механизм сессий использует работу с теми же cookies-файлами, но для системного администратора или программиста работа эта более прозрачна и удобна. Сессии позволяют идентифицировать пользователя, а нам с вами останется «прикрутить» к этой структуре только наш модуль аутентификации пользователей.
Итак, нам как в прошлом примере нужно создать два скрипта. Первому будет передаваться логин и пароль, а второй будет добавляться ко всем защищенным страницам. И можно еще добавить третий скрипт, который будет осуществлять выход пользователя из системы и подчищать за собой файлы сессий на компьютере пользователя и на сервере. Начинать будем, разумеется, с первого пункта — авторизации. Проверка логина и пароля производится точно таким же образом, как и в предыдущем случае. Только после этого мы не будем создавать cookie-файл, а запустим сессию.
<?
mysql_connect('localhost', 'root');
mysql_select_db('user');
$login = $HTTP_POST_VARS[«login»];
$pass = $HTTP_POST_VARS[«password»];
$user_result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='". md5($pass). "'");
if (mysql_error())
die(mysql_error());
elseif (@mysql_num_rows($user_result) != 1)
$error = "Неверное имя пользователя или пароль.";
else {
$user = mysql_fetch_assoc($user_result);
session_set_cookie_params(1800, "/");
session_start();
session_register(«user»);
// Устанавливаем время жизни сессии в 30 минут, стартуем ее и просим запоминать логин и пароль пользователя далее в массиве $user.
header("Location: /session/index2.php");
};
if (isset($HTTP_COOKIE_VARS[session_name()]))
setcookie(session_name());
?>
Теперь нам нужно на каждую страницу добавить скрипт проверки правильности сессии. В принципе, все аналогично работе с cookie-файлами. Для того чтобы было понятно, я добавлю комментарии в сам код скрипта:
<?
mysql_connect('localhost', 'root');
mysql_select_db('user');
unset($user);
// В эту переменную мы запишем true, если возникнет какая-то ошибка.
$session_error = false;
// Если у пользователя нет открытой сессии, то выдаем ошибку.
if (!isset($HTTP_COOKIE_VARS[session_name()]))
$session_error = true;
else {
session_start();
session_register(«user»);
if (!isset($user[«login»]) || !isset($user[«password»]))
$session_error = true;
};
if (!$session_error) {
$user_result = mysql_query("SELECT * FROM users WHERE login='{$user[login]}' AND password='{$user[password]}'");
if (mysql_error() || @mysql_num_rows($user_result) != 1)
$session_error = true;
};
// если была какая-то ошибка, то
if ($session_error) {
// уничтожаем данные сессии
session_destroy();
if (!isset($HTTP_COOKIE_VARS[session_name()]))
setcookie(session_name(),«»,"/");
// отправляем пользователя на вход
header("Location: /");
// прекращаем работу
exit();
};
mysql_free_result($user_result);
echo "Вы авторизованы!";
?>
В этом материале мы постарались собрать для вас наиболее популярные и простые способы аутентификации пользователей. Какой из них выбрать — решать вам, тем более что каждый способ снабжен работающим примером скрипта.
Ссылки по теме
- Сайт сервера Apache
- Русскоязычный сайт, посвященный программированию на PHP
Статья получена: hostinfo.ru