Возникла у меня необходимость в аутентификации через LDAP, да еще и в PhP реализации. Основными условиями было проверка логина и пароля пользователя, плюс он должен был быть в определенной группе в AD. Если оба условия выполняются, то дается доступ к определенному контенту. Вот к чему я пришел:
Первый файл, будет у нас с настройки — ldap.php :
<?php //ip адрес или название сервера ldap(AD) $ldaphost = "10.10.0.10"; //Порт подключения $ldapport = "389"; //Полный путь к группе которой должен принадлежать человек, что бы пройти аутентификацию. //"cn=allow_ppl,ou=users_IT,ou=IT,ou=Kyiv,ou=corp,dc=osticket,dc=org" - это //мой пример. $memberof = "cn=allow_ppl,ou=users_IT,ou=IT,ou=Kyiv,ou=corp,dc=osticket,dc=org"; //Откуда начинаем искать $base = "ou=corp,dc=osticket,dc=org"; //Собственно говоря фильтр по которому будем аутентифицировать пользователя $filter = "sAMAccountName="; //Ваш домен, обязательно с собакой впереди. Необходим этот параметр //для авторизации через AD, по другому к сожалению работать не будет. $domain = "@teaseo.ru"; ?>
Теперь, сам скрипт Аутентификации — auth.php:
<?php //Начинаем сессию session_start(); //Подключаем конфигурационный файл include_once ("ldap.php"); // Logout if (isset($_GET['logout'])) { if (isset($_SESSION['user_id'])) { unset($_SESSION['user_id']); setcookie('login', '', 0, "/"); setcookie('password', '', 0, "/"); header('Location: index.php'); exit; } } //Если пользователь уже аутентифицирован, то перебросить его на страницу main.php if (isset($_SESSION['user_id'])) { header('Location: main.php'); exit; } //Если пользователь не аутентифицирован, то проверить его используя LDAP if (isset($_POST['login']) && isset($_POST['password'])) { $username = $_POST['login']; $login = $_POST['login'].$domain; $password = $_POST['password']; //подсоединяемся к LDAP серверу $ldap = ldap_connect($ldaphost,$ldapport) or die("Cant connect to LDAP Server"); //Включаем LDAP протокол версии 3 ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); if ($ldap) { // Пытаемся войти в LDAP при помощи введенных логина и пароля $bind = ldap_bind($ldap,$login,$password); if ($bind) { // Проверим, является ли пользователь членом указанной группы. $result = ldap_search($ldap,$base,"(&(memberOf=".$memberof.")(".$filter.$username."))"); // Получаем количество результатов предыдущей проверки $result_ent = ldap_get_entries($ldap,$result); } else { die('Вы ввели неправильный логин или пароль. попробуйте еще раз<br /> <a href="index.php">Вернуться назад</a>'); } } // Если пользователь найден, то пропускаем его дальше и перебрасываем на main.php if ($result_ent['count'] != 0) { $_SESSION['user_id'] = $login; header('Location: main.php'); exit; } else { die('К сожалению, вам доступ закрыт<br /> <a href="index.php">Вернуться назад</a>'); } } ?>
И собственно говоря стартовый index.php:
<?php // Подключаем файл auth.php include_once ("auth.php"); ?> //Хидер <head> <meta http-equiv="Content-Type" content="text/html; charset=koi8-r" /> <title>Postfix Транспорт</title> </head> <?php // Форма для ввода пароля и логина print ' <form action="index.php" method="post"> <table> <tr> <td>Имя:</td> <td><input type="text" name="login" /></td> </tr> <tr> <td>Пароль:</td> <td><input type="password" name="password" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Авторизироваться" /></td> </tr> </table> </form> '; echo "<br /><h3>Для авторизации необходимы ваши учетные данные</h3>"; ?>
Вот собственно и все, теперь перейдем к некоторым тонкостям, для того, что бы данная аутентификация работала вам в обязательном порядке необходимо в начале каждого файла вставить session_start();
А так же, все то, что пользователь должен увидеть только пройдя аутентификацию, должно быть заключено в
if (isset($_SESSION['user_id'])) { <Скрытый Контент> }
O.K. says:
Спасибо за помощь 🙂
admin says:
Не за что, пользуйтесь 🙂
MEX says:
После ввода логина и пароля, выдает сообщение: К сожалению, вам доступ закрыт.
Я так понимаю до этой вот проверки все нормально, а вот ниже не проходит:
// Если пользователь найден, то пропускаем его дальше и перебрасываем на main.php
if ($result_ent[‘count’] != 0)
{
$_SESSION[‘user_id’] = $login;
header(‘Location: main.php’);
exit;
}
else
{
die(‘К сожалению, вам доступ закрыт Вернуться назад‘);
}
подскажете, где копать?
admin says:
Копать скорее всего надо в подключение и проверку в ЛДАП-е.
Владимир says:
Спасибо, за статью — написана читабельно и доходчиво. У меня вопрос теоретического плана. Есть сайт на джумле. Есть корпоративная сеть, данные сотрудников есть в AD. Нужно 1) синхронизировать данные о пользователях из AD и базу данных джумлы — этот вопрос решен. 2) Когда сотрудник вошел в винду (XP, win7) и открыл сайт при этом должен происходить авто-логин, т.е. php скрипт как то должен узнать что этот пользователь авторизован в системе и какой у него логин. Возможно ли средствами php/javascript/ldap получить эту информацию?
admin says:
Ни разу такого не делал, поэтому не хочу соврать и дать однозначный ответ.
Дмитрий says:
В данном случае необходимо копать в сторону авторизации через Apache (например mod_auth_sspi для windows сервера) и получать логин пользователя из php ($_SERVER[‘REMOTE_USER’]). Вот только действительно «прозрачная» авторизация получится скорее всего только в IE. С теорией вроде все. Экспериментируйте, удачи!
Виталий says:
Спасибо за ман, завелось с первого раза!
Ahmed says:
Здравствуйте !
У меня к вам вопрос: как вы считаете, аутентификация и авторизация есть одно и тоже? Если нет, то вы в постановке вашей задачи написали : «Возникла у меня необходимость в аутентификации через LDAP,» тогда как Index.php есть кнопка «Авторизоваться». Просто у меня такая же задача но мне надо реализовать авторизацию пользователей через ldap.
С Уважением,
Ахмед
Мухаммад says:
Почем у меня ошибка дает:
ldap_search() [function.ldap-search]: Search: Operations error in /home/bsmega/public_html/promer/auth.php on line 46
а вот эта строка 46 строка:
$result = ldap_search($ldap,$base,»(&(memberOf=».$memberof.»)(«.$filter.$username.»))»);