Форум проекта Pro-LDAP.ru
Общие вопросы по LDAP => Общий раздел => Тема начата: alexskl21 от 13 Январь 2017, 14:46:21
-
Здравствуйте. У меня есть сервер Minecraft, на котором проводятся определенные тренинги. Я написал лаунчер для Minecraft, в который хочу интегрировать LDAP-аутентификацию. Также имеется множество других систем, на которых эта же аутентификация может понадобиться позже. С LDAP раньше никак не сталкивался. Помогите, пожалуйста, чайнику - с чего начать, что прочитать, куда еще обратиться, как лучше реализовать и т.д. Имеется сервер, доступный по ссылке
Сейчас лаунчер обращается к php-файлу, который обращается к базе данных sql, проверяя логин и пароль. Следовательно, нужно, чтобы php-файл обращался к базе данных ldap, которую нужно как-то создать, а вот как - для меня не совсем ясно.
-
Здравствуйте!
Сейчас попробую объяснить идею проверки аутентификации с использованием каталога LDAP. Вообще, не совсем корректно называть каталог базой данных, скорее это коллекция объектов. Так вот, для проверки аутентификации у вас в каталоге должны быть объекты (в терминологии LDAP они называются записями) пользователей в которых, кроме всего прочего, хранится ещё и логин с паролем, например, такая запись:
dn: uid=ivanov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: ivanov
cn: Ivan Ivanov
sn: Ivanov
userPassword: 123
Здесь логин хранится в атрибуте uid, а пароль -- в атрибуте userPassword. В данном случае пароль в открытом виде (123), но чаще всего в каталогах он хранится в хэшированном виде, например, тот же 123:
userPassword: {SSHA}WmnNw6gcYLQGFa+HOtXD6T4sR+yQqw+e
Поскольку из хэша получить обратно пароль нельзя, то общепринятой практикой проверки аутентификации через LDAP является так называемое "простое подсоединение" (Simple Bind) к каталогу: если с помощью полученных откуда-либо логина с паролем можно пройти аутентификацию в каталоге с помощью операции Simple Bind, то эти удостоверяющие данные считаются верными. Единственный момент: в качестве имени пользователя для операции Simple Bind используется полное уникальное имя (DN) записи пользователя, то есть uid=ivanov,ou=People,dc=mycompany,dc=ru. В программном коде, получив логин, такую строчку можно легко составить.
Итак, подразумевая, что нам нужно проверить аутентификацию пользователя в каталоге, где хранится приведённая выше запись, можно написать такую php-функцию:
<?php
if(test_ldap_auth('ivanov','123')) echo "good\n"; else echo "bad\n";
function test_ldap_auth($login, $password)
{
$ldapURI = 'ldap://127.0.0.1:389'; // URI LDAP-сервера
$usersBaseDN = 'ou=People,dc=mycompany,dc=ru'; // ветка каталога, где хранятся записи пользователей
set_error_handler(function($errno, $errstr){throw new \Exception($errstr, $errno);}, E_WARNING);
$result = true;
try
{
$conn = ldap_connect($ldapURI); // подключаемся к LDAP-серверу
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); // указываем, что используется 3-я версия протокола LDAP
ldap_bind($conn, 'uid=' . $login . ',' . $usersBaseDN , $password); // Simple Bind с указанием DN записи и пароля
ldap_close($conn); // отключаемся от LDAP-сервера
}
catch(Exception $e)
{
$result = false;
}
restore_error_handler();
return $result;
}
?>
В принципе, всё довольно просто. Если у Вас где-то висит постоянный процесс (демон) аутентификации, то функцию можно оптимизировать, изъяв из тела функции подключение к серверу и отключение от него (то есть сделать подключение постоянным), а в функции оставить только ldap_bind().
Если возникнут вопросы, пишите.
Егор