Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

17.2. Основные концепции при программировании авторизации

Прежде всего при осуществлении авторизации чтобы РНР был установлен как модуль Apache, а не CGI или IIS. Дело в том, что только в этом случае происходит доступ к константам $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE, которые используются в процессе авторизации (при их помощи получают значения логина, пароля и типа). Функция header() производит вызов окна, в которое и будет заноситься (вводиться) наш пароль и логин. После того как вы введете эти значения и нажмете на кнопку «ОК», ваши данные будут переданы следующим переменным. Значение, которое вы ввели в поле пароля, будет передано зарезервированной константе $PHP_AUTH_PW, и соответственно значение, которое вы ввели в поле логина, будет передано константе $PHP_AUTH_USER Далее весь процесс осуществления авторизации вы можете вести, выполняя элементарные действия программирования, вплоть до вывода имеющегося пароля. В частности, можно сравнить введенные данные с имеющимися, и если они верны, разрешить доступ к скрытым данным вашего сайта. В противном случае предложить пользователю либо зарегистрироваться, либо связаться с администратором для обсуждения условий регистрации.

Например, вам необходимо ограничить доступ к одной из страниц, т. е. вы бы хотели позволить получать данные этой страницы только избранным пользователям. В этом случае можно воспользоваться следующим кодом:

if ($PHP_AUTH_USER != $name || $PHP_AUTH_PW != $pass) {

    header("www-Authenticate: Basic realm=\"secret area\"");

    header("HTTP/1.0 401 Unauthorized");

    echo "Authorization Required.";

    exit;

}

Переменные $name и $pass и будут содержать именно то верное значение которое необходимо ввести пользователю при получении равноправного доступа Данный коддолжен идти до любого вывода данных в браузер, прежде чем вы начнете выполнять какие либо операции, вам необходимо вставить данный код в начало страницы. Что касается условия в самой первой строке, то оно может быть любым, вплоть до проверки существования такого пароля и имени в вашей базе данных. Если у вас появилась необходимость ограничить доступ по паролю к нескольким страницам, просто м ожете вставить этот код в каждую страницу.

Приведем пример, позволяющий выводить ваш пароль и логин при регистрации и предоставлении всех имеющихся данных пользователю в момент проверки переданных данных:

<?php

if (!isset($РНР_AUTH_USER) ) {

    header ("WWW-Authenticate: Basic realm=\"$realm\""); header ("HTTP/1.0 401 Unauthorized");

    echo "Вам отказано в доступе\п"; exit ;

} else {

    echo "Доброго времени суток $PHP_AUTH_USER.<Р>";

    echo "Пароль, который вы ввели, является $PHP_AUTH_PW<P>";

}

?>

Данный пример работает очень просто. Если этот скрипт расположен в начале файла, происходит вызов функции header() , в ходе выполнения которой на экране вашего монитора появиться диалоговое окно, в котором вам будет предлагаться ввести пароль. Если вы нажмете на кнопку с надписью «Cancel», будет выполнена строка программы echo "Вам отказано в доступе\n" ;, что, конечно же, приведет к запрету в доступе к документу. В противном случае вы благополучно введете ваши логин и пароль, этим самым передадите после нажатия кнопки переменным $PHP_AUTH_USER $PHP_AUTH_PW значения логина и пароля соответственно. Сам скрипт сможет производить работу с этими данными, в нашем же случае он просто произведет вывод данных на экран браузера. Для чего это может быть полезно, объяснять не стоит. Теперь вы без проблем сможете работать с паролем и логином.

Приведем код программы, который является рациональным в использовании РНР как модуля Apache, а также и в случае CGI. Текст скрипта содержится в файле testpwd.php:

<?

if (!session_is_registered("pwd")) session_register("pwd");

if (!session_is_registered("usr")) session_register("usr");

if(!session_is_registered("go")) {

    session_register("go") ;

}

if(php_sapi_name() == "cgi") {

    if( ($usr_cgi != $GLOBALS['user'] || $pwd_cgi != $GLOBALS[' password']) && $go != 789) {

?>

<table><form method=GET>

<? if (isset($usr_cgi) || isset($pwd_cgi))

    echo "<tr><td colspan=2>

    <font color=red>Введите правильный пароль/имя пользователя</font></td></tr>" ?>

<tr><td>Username please</td><td><input name=usr_cgi size="7"><br></td></tr>

<tr><td>Password please</td><td><input type =password name=pwd_cgi size="7"><br></td>

</tr><tr><td><input type="submit" value=Ввести></td></tr>

</form>

</table>

<?;

exit();

}

}

else

    if ( !isset ($PHP_AUTH__USER) ) { // эта переменная передается,

    // только если введен

    // пароль и имя в окошке, которое вызывается специальным

    // заголовком. Эта часть передает специальный заголовок

    header("WWW-AuthenticateBasic realm=\"Введите ваш пароль\"");

    header("НТТР/1.0 401 Unauthorized");

    $GLOBALS['title'] = "Autentification Error!";

    require_once("./_top.php");

    echo "

    <p class=\"b\">Вы нажали Cancel! </p>";

    require_once("./_bot. php");

    exit;

    }

    else { // здесь будет ваш код по проверке пароля...

        if ($PHP_AUTH_USER!=$GLOBALS['user'] || $PHP_AUTH_PW != $GLOBALS['password'] ) {

            header("WWW-Authenticate: Basic realm=\"Введите ваш пароль\ "");

            $GLOBALS['title'] = "Autentification Error!";

            require_once("./_top.php");

        echo "<p class=\"b\">Error ! </p>";

        require_once("./_bot.php");

        exit ;

    }

}

$go=789;

?>

Следующий пример иллюстрирует включение скрипта для введения системы аутентификации в вашу программу:

<?

// пароль и имя пользователя. Если у вас есть группа скриптов

// и вы хотите только один раз вводить пароль и имя пользователя

// для доступа к ним, то следующую строку запишите в отдельный

// файл, после чего включите этот файл во все ваши скрипты:

require_once("user.php");

$GLOBALS['user' ] = "server";

$GLOBALS['password'] = "pwd";

require_once("./testpwd.php"); // < --- аутентифицирующий скрипт

echo "Here is a secret information";

?>

Обязательно разберитесь с принципами работы данного скрипта.

Вместо простого распечатывания $PHP_AUTH_USER и $PHP_AUTH_PWB вы, вероятно, хотели бы проверить имя пользователя и пароль. Это можно сделать, посылая запрос к базе данных или ища пользователя в файле dbm.

Не перепутайте порядок функций header(). Наиболее правильный порядок формирования запроса функции header() таков: WWW-Authenticate раньше, чем HTTP/1.0 4.01, так как браузер Internet Explorer чувствителен к этому порядку.

Как Netscape Navigator, так и Internet Explorer способны производить очистку локального окна программы просмотра опознавательного кэша, т. е. другими словами, после того как интерпретатор РНР получит ответ 401, он произведет очистку кэша, где будут сохранены значения пароля и имени, введенные пользователем. Это помогает эффективно выходить из системы.

<?php

function authenticate () {

    header( "WWW-authenticate: basic realm=\"$realm\"");

    header("HTTP/1.0 401 Unauthorized");

    echo "Для того, чтобы получить доступ к данному ресурсу, вам необходимо ввести логин и пароль\n";

    exit;

}

if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) {

    authenticate();

}

else {

    echo "Welcome: $PHP_AUTH_USER<br>";

    echo "Old: $OldAuth";

    echo "<form action=\"$PHP_SELF\" method=post>\n";

    echo "<input type=hidden NAME=\"SeenBefore\" value=\"l\">\n";

    echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" value=\"$PHP_AUTH_USER\">\n";

    echo "<input type=Submit value=\"Re Authenticate\">\n";

    echo "</form>\n";

}

?>

Испытание операционной системы Lynux показало, что Lynux не очищает данные при ответе станции 401. В этом случае пользователи могут нажимать клавишу «_», чтобы очистить их опознавательную информацию.


ВНИМАНИЕ

Описанное выше не работает при использовании IIS Microsoft Server и CGI-версии РНР из-за ограничения IIS.


<< Предыдущий параграф Следующий параграф >>
Оглавление