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=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']))
{ <Скрытый Контент> }

 

0 thoughts on “PhP авторизация через LDAP

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

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

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

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

  • Владимир says:

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

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

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

    У меня к вам вопрос: как вы считаете, аутентификация и авторизация есть одно и тоже? Если нет, то вы в постановке вашей задачи написали : «Возникла у меня необходимость в аутентификации через 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.»))»);

Leave a Reply

Ваш адрес email не будет опубликован.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>