PhP авторизация через LDAP

Возникла у меня необходимость в аутентификации через 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=eddnet,dc=org" - это
//мой пример.
$memberof = "cn=allow_ppl,ou=users_IT,ou=IT,ou=Kyiv,ou=corp,dc=eddnet,dc=org";
//Откуда начинаем искать 
$base = "ou=corp,dc=eddnet,dc=org";
//Собственно говоря фильтр по которому будем аутентифицировать пользователя
$filter = "sAMAccountName=";
//Ваш домен, обязательно с собакой впереди. Необходим этот параметр 
//для авторизации через AD, по другому к сожалению работать не будет.
$domain = "@eddnet.org";
?>

Теперь, сам скрипт Аутентификации — 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']))
{ <Скрытый Контент> }

 

Случайные Статьи

Loading…


Количество просмотров :42899

13 Comments

  1. O.K.:

    Спасибо за помощь :)

  2. MEX:

    После ввода логина и пароля, выдает сообщение: К сожалению, вам доступ закрыт.

    Я так понимаю до этой вот проверки все нормально, а вот ниже не проходит:

    // Если пользователь найден, то пропускаем его дальше и перебрасываем на main.php
    if ($result_ent[‘count’] != 0)
    {
    $_SESSION[‘user_id’] = $login;
    header(‘Location: main.php’);
    exit;
    }
    else
    {
    die(‘К сожалению, вам доступ закрыт Вернуться назад‘);
    }

    подскажете, где копать?

  3. Владимир:

    Спасибо, за статью — написана читабельно и доходчиво. У меня вопрос теоретического плана. Есть сайт на джумле. Есть корпоративная сеть, данные сотрудников есть в AD. Нужно 1) синхронизировать данные о пользователях из AD и базу данных джумлы — этот вопрос решен. 2) Когда сотрудник вошел в винду (XP, win7) и открыл сайт при этом должен происходить авто-логин, т.е. php скрипт как то должен узнать что этот пользователь авторизован в системе и какой у него логин. Возможно ли средствами php/javascript/ldap получить эту информацию?

    • admin:

      Ни разу такого не делал, поэтому не хочу соврать и дать однозначный ответ.

    • Дмитрий:

      В данном случае необходимо копать в сторону авторизации через Apache (например mod_auth_sspi для windows сервера) и получать логин пользователя из php ($_SERVER[‘REMOTE_USER’]). Вот только действительно «прозрачная» авторизация получится скорее всего только в IE. С теорией вроде все. Экспериментируйте, удачи!

  4. Виталий:

    Спасибо за ман, завелось с первого раза!

  5. Ahmed:

    Здравствуйте !

    У меня к вам вопрос: как вы считаете, аутентификация и авторизация есть одно и тоже? Если нет, то вы в постановке вашей задачи написали : «Возникла у меня необходимость в аутентификации через LDAP,» тогда как Index.php есть кнопка «Авторизоваться». Просто у меня такая же задача но мне надо реализовать авторизацию пользователей через ldap.

    С Уважением,
    Ахмед

  6. Мухаммад:

    Почем у меня ошибка дает:
    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.»))»);

  7. Влад:

    Спасибо за статью! Очень нужный пример реализации :)

  8. Дмитрий:

    Спасибо, познавательно и полезно.
    Но есть такой вопрос.
    Сейчас сессия устанавливается с именем (id) пользователя.
    И зона видимости этой сессии — весь сервер?
    У меня есть необходимость разграничить доступ по каталогам.
    То есть для каждого каталога — авторизация по отдельной группе в ОУ LDAP.
    C данным кодом получается, что в одном каталоге мы правильно авторизовались с необходимым пользователем, доступ получили, но если человек перейдет в другой каталог — сессия подхватится и он получит доступ к тамошним файлам.

    Как решить непонятку? Может в скрипте авторизации у станавливать н только user_id но и, например и зонувидимости? и соответственно проверять не только сессию с user_id но и зону видимости?

    кто нибудь пробовал? или есть более правильное решение? (а не этот велосипед из костылей))))))

  9. alexander:

    Мне выдает HTTP ERROR 500
    Может это из-за PHP 7….

Оставьте коментарий