Применение LDAP для аутентификации пользователей

Задача
Требуется открыть определенные разделы сайта только для авторизованных пользователей. Информация о пользователях не сравнивается с записями в базе данных, не применяется базовая аутентификация HTTP, а используется LDAP-сервер. Сохранение всей информации о пользователях на LDAP-сервере облегчает их централизованное администрирование.

Решение
Для этого применяется PEAR-класс Auth, поддерживающий LDAP-аутентификацию:

$options = array('host' => 'ldap.example.com',
'port' => '389',
'base' => 'o=Example Inc., c=US',
'userattr' => 'uid');
$auth = new Auth('LDAP', $options);
// начинаем проверку подлинности
// выводим экран регистрации для анонимных пользователей
$auth->start();
if ($auth->getAuth()) {
// содержание для авторизованных пользователей
} else {
// содержание для анонимных пользователей
}
// выход пользователей
$auth->logout();

Обсуждение
LDAP-серверы разработаны для хранения, поиска и извлечения адресов, поэтому они предпочтительнее, чем стандартные базы данных, такие как MySQL или Oracle.


LDAP-серверы очень быстрые, позволяют легко реализовать контроль доступа, предоставляя разнообразные права доступа различным группам пользователей; кроме того, сервер могут запрашивать многие другие программы. Например, большинство почтовых клиентов могут использовать LDAP-сервер в качестве адресной книги, поэтому если сообщение отправляется «Джону Смиту», то сервер возвращает адрес электронной почты Джона, jsmith@example.com.

PEAR-класс Auth позволяет проверять подлинность пользователей путем сравнения их данных в файлах, в базах данных и на LDAP-серверах. Первый параметр представляет тип аутентификации, а второй параметр – это массив с информацией о том, как проверять подлинность пользователя. Например:

$options = array('host' => 'ldap.example.com',
'port' => '389',
'base' => 'o=Example Inc., c=US',
'userattr' => 'uid');
$auth = new Auth('LDAP', $options);

Этот код создает новый объект Auth, проверяющий подлинность по информации LDAP-сервера, находящегося на ldap.example.com и работающего через порт 389. Имя базового каталога o=Example Inc., c=US, а имя пользователя сравнивается с атрибутом uid. Поле uid служит идентификатором пользователя.


Обычно это имя пользователя на веб-сайте или регистрационное имя главной учетной записи. Если ваш
сервер не хранит атрибуты uid для всех пользователей, то можно указать атрибут cn. Поле стандартного имени содержит полное имя пользователя, например «John Q. Smith».

Метод Auth::auth() принимает также необязательный параметр – имя функции, отображающей регистрационную форму. Эта форма может быть отформатирована в соответствии с вашим желанием; единственное требование, чтобы поля ввода были названы username и password. Кроме того, форма должна представлять данные с помощью метода POST.

$options = array('host' => 'ldap.example.com',
'port' => '389',
'base' => 'o=Example Inc., c=US',
'userattr' => 'uid');function pc_auth_ldap_signin() {
print<<<_HTML_
Name:
Password:

_HTML_;
}
$auth = new Auth('LDAP', $options, 'pc_auth_ldap_signin');

После создания объекта Auth пользователь идентифицируется с помощью вызова Auth::start():

$auth->start();

Если пользователь уже зарегистрирован, то ничего не происходит.


Если пользователь анонимный, то выводится форма регистрации. Для проверки подлинности пользователя функция Auth::start() соединяется с LDAP-сервером, выполняет анонимное связывание и ищет адрес, для которого пользовательский атрибут, указанный в конструкторе, совпадает с именем пользователя, переданным в форме:

$options['userattr'] == $_POST['username']

Если метод Auth::start() находит только одного человека, удовлетворяющего критерию, то он возвращает отмеченное имя пользователя и пытается выполнить авторизованное связывание, указав отмеченное имя и пароль из формы в качестве регистрационной информации. Затем LDAP-сервер сравнивает пароль с атрибутом userPassword, связанным с отмеченным именем. Если они совпадают, то пользователь проходит аутентификацию.
Можно вызвать функцию Auth::getAuth(), которая возвращает логическое значение, описывающее статус пользователя:

if ($auth->getAuth()) {
print 'Welcome member! Nice to see you again.';
} else {
print 'Welcome guest. First time visiting?';
}

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

$auth->logout();

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Отправка почты
Отправка почты в кодировке MIME
Отправка сообщений в новостные группы Usenet
Поиск адресов с помощью LDAP
Поиск в DNS

Вернуться в раздел: PHP / 17. Интернет-службы