Перейти к контенту
  • 0

Подключение к LDAP каталогу


alexlist

Вопрос

ВНИМАНИЕ

Советую перед началом, обязательно обзавестись любым LDAP BROWSER-ом

Я вооружился http://www.iit.edu/~gawojar/ldap] http://www.iit.edu/~gawojar/ldap[/url] (написан на джава)

Можно другим. Не принципиально важно

 

ПРЕАМБУЛА

ЛДАП каталогов масса. И настроены они могут быть как угодно.

Так что как показала практика не все так просто в привязке данного форума

В моём случае это LDAP каталог на основе почтовика EXCHANGE

Ещё в моей сети есть Новеловский каталог. Но в нём нет данных о почтовых адресах

Поэтому было отдано предпочтение первому.

 

Для мало просвещенных скажу что ЛДАП каталог может быть настроен так чтобы требовать авторизацию а может и пускать анонимно.

В моём случае с авторизацией.

 

 

Так вот сначала в LDAP BROWSERе пытаетесь подсоединится к Вашему каталогу.

До тех пор пока не увидите полную ветку вашего домена со всеми пользователями и группами. (Пока этого не будет дальше идти бессмысленно.)

Затем уже переносите все настройки от туда в файл "ldap\conf.php"

В моём случае получилось

<?php
$LOGIN_CONF = array();
$LOGIN_CONF['ldap_server'] = '10.1.1.1';
$LOGIN_CONF['ldap_port'] = '389';
$LOGIN_CONF['ldap_server_username'] = 'cn=username';
$LOGIN_CONF['ldap_server_password'] = 'pass';
$LOGIN_CONF['ldap_uid_field'] = 'rdn';
$LOGIN_CONF['ldap_base_dn'] = 'o=MyDomain;
$LOGIN_CONF['ldap_server_version'] = 3;
$LOGIN_CONF['ldap_username_suffix'] = '';
$LOGIN_CONF['ldap_user_requires_pass'] = 1;
?>

 

Если возникнут затруднения советую поиграться с DN путем (у меня вопреки всем стандартам не пускало при указании полного base_dn)

 

Если всё ок. Идем дальше в админку форума (Закладка «НАСТРОЙКИ»)

Слева в меню->Системы авторизации->Управление->LDAP Авторизация->Изменить детали

Выставляем галки как ниже.

Заменить HTML формой выше? (Нет)

Включить метод? (Да)

Разрешить создание пользователя? (Да)

 

 

Так как я уже говорил мой ЛДАП каталог работает вопреки всем стандартам (Микрософт как ни как)

Пришлось помудрить в самом модуле лдапа.

 

файл "ldap\auth.php"

(1)Удаляем uid_field при поиске (Уже не помню зачем)

$search = @ldap_search( $this->connection_id,
	$this->login_conf['ldap_base_dn'],
	$this->login_conf['ldap_uid_field']. '=' . $real_username,
	array( $this->login_conf['ldap_uid_field'] )

меняем на

$search = @ldap_search( $this->connection_id,
	$this->login_conf['ldap_base_dn'],
	$this->login_conf['ldap_uid_field']. '=' . $real_username
 		   );

 

 

(2) парсим и укорочиваем DN (при полном пути я даже через лдап браузер не мог законектится)

$this->dn	 = @ldap_get_dn( $this->connection_id, $this->result );

После кода добавляем

$this->dn 	  = strtok($this->dn, ",");

 

 

 

(3)Возникала проблема что в случае успешного Первого логина пользователя учетка создавалась.

Но его выкидывало на страницу регистрации и тока при последующих логинах было всё ок. Поэтому повторно загружаем данные о пользователе после его создания.

if ( $this->allow_create )
{
$this->create_local_member( $username, $password );

После кода добавляем

$this->_load_member( $username );
if ( $this->member['id'] )
{
$this->return_code = 'SUCCESS';
}

 

 

 

 

 

файл "loginauth\login_core.php"

(1)Парсим результаты запросса к лдап каталогу. И берем для будущего пользователя всё что нам нужно.

Если возникают проблемы, распечатаейте массив "$this->fields". И посмотрите что именно вы получаете в качестве параметров и получаете ли вообще.

$member = array(
'name'				   => $username,
'members_created_remote' => 1,
'email'				  => $email_tmp,

Меняем на

$member = array(
'name'				   => $username,
'members_display_name'   => (iconv('utf-8','windows-1251',$this->fields["cn"][0])),
'members_created_remote' => 0,
'email'				  => strtolower($this->fields["mail"][0]),

 

 

(2)Эта строчка отправляла логиневшегося человека на дорегистрацию(Ввод имени и мыла).

Мы уже всё взяли из ЛДАПА. поэтому нет смысла

$this->ipsclass->print->redirect_screen( $this->ipsclass->lang['partial_login'], 'act=reg&CODE=complete_login&mid='.$member['id'].'&key='.$timenow );

Удаляем этот кусок кода

 

 

 

ШАБЛОНЫ

 

Когда всё работает можно и с шаблонами немного поигратся.

Так как в моей организации каждый сидит за своим компом. И пользователем может быть только доменный юзер.

То нет надобности в таких кнопочках как "Регистрация", "Вход", "Выход"

Их можно удалить

 

 

Первоночально в админке форума я запретил саму страницу "Регистрации"

 

В файле шаблона "skin_global.php"

<p class="pcen"><b>{$this->ipsclass->lang['guest_stuff']}</b> ( <a href="{$this->ipsclass->base_url}act=Login&CODE=00">{$this->ipsclass->lang['log_in']}</a> | <a href="{$this->ipsclass->base_url}act=Reg&CODE=00">{$this->ipsclass->lang['register']}</a> )

Меняем на

<p class="pcen"><b>{$this->ipsclass->lang['guest_stuff']}</b>

----------------------------------------------------

<p class="home"><b>{$this->ipsclass->lang['logged_in_as']} <a href="{$this->ipsclass->base_url}showuser={$this->ipsclass->member['id']}">{$this->ipsclass->member['members_display_name']}</a></b> ( <a href="{$this->ipsclass->base_url}act=Login&CODE=03&k={$this->ipsclass->md5_check}">{$this->ipsclass->lang['log_out']}</a> )</p>

Меняем на

<p class="home"><b>{$this->ipsclass->lang['logged_in_as']} <a href="{$this->ipsclass->base_url}showuser={$this->ipsclass->member['id']}">{$this->ipsclass->member['members_display_name']}</a></b></p>

 

В файле шаблона "skin_login.php"

 

Излишние предупреждения о регистрациях тока напрягают пользователей. ТАк что можно их почикать

<div class="errorwrap">
<h4>{$this->ipsclass->lang['form_title_attention']}</h4>
<p>{$this->ipsclass->lang['login_text']}</p>
<p><b>{$this->ipsclass->lang['forgot_pass']} <a href="{$this->ipsclass->vars['board_url']}/index.{$this->ipsclass->vars['php_ext']}?act=Reg&CODE=10">{$this->ipsclass->lang['pass_link']}</a></b></p>
</div>

Удаляем кусок кода

---------------------------------------------------

 

Это если мы хотим всегда запоминать польльзователя

<tr>
<td width="10%"><input type="checkbox" name="CookieDate" value="1" checked="checked" /></td>
<td width="90%"><b>{$this->ipsclass->lang['rememberme']}</b><br /><span class="desc">{$this->ipsclass->lang['notrecommended']}</span></td>
</tr>

Заменяем на

<input type="hidden" name="CookieDate" value="1" />

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0
Советую перед началом, обязательно обзавестись любым LDAP BROWSER-ом...

 

Спасибо тебе большушее, отлично написал!!!

 

Вот что в моем случае было по другому:

 

вместо

<?php
$LOGIN_CONF['ldap_server_username'] = 'cn=username';
?>

получилось

<?php
$LOGIN_CONF['ldap_server_username'] = 'username';
?>

 

 

а вот этот пункт для меня оказался лишним:

(2) парсим и укорочиваем DN (при полном пути я даже через лдап браузер не мог законектится)

$this->dn	 = @ldap_get_dn( $this->connection_id, $this->result );

После кода добавляем

$this->dn 	  = strtok($this->dn, ",");

 

 

Теперь осталось понять, как прикрутить NTLM авторизацию.

Что бы пользователи которые уже залогинились в мелкософт сети, заходили под своим именем сразу же без излишних телодвижений.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Спасибо тебе большушее, отлично написал!!!

Всегда пожалуйста. Чесно говоря я думал зря писал.

Три месяца прошло а народ даж не отреагировал ни как.

А терь стало приятно что хоть комуто пригодилось

 

 

Теперь осталось понять, как прикрутить NTLM авторизацию.

Что бы пользователи которые уже залогинились в мелкософт сети, заходили под своим именем сразу же без излишних телодвижений.

 

Да там тоже ни чё сложного нет. Я после опубликования этой статьи пошел дальше и доработал до NTLM авторизации.(у меня на внутреннем сайте тоже стоит принудительная авторизация и пользователю как бы удобно не вводить пароль ещё раз)

 

Но потом подумав и всё взвесив решил оставить так.

Чтобы пользователи свои пароли доменные хоть иногда вспоминали. :D

Да и в принципе после замены в шаблоне самого посследнего пункта

<input type="hidden" name="CookieDate" value="1" />

Они логинятся только один раз. Дальше им насильно кладутся кукисы

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Да там тоже ни чё сложного нет. Я после опубликования этой статьи пошел дальше и доработал до NTLM авторизации.

 

У меня есть скрипт который запрашивает логин у браузера, пока не могу понять куда его вставлять.

Может поделишся авторизацией?

 

спасибо ещё раз.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Спасибо! Полтора года прошло, но за четыре дня гугленья только эти советы оказали реальную помощь.

 

Сейчас буду искать NTLM-авторизацию...

 

Добавки к вашим исследованиям:

 

$LOGIN_CONF['ldap_server_username'] = 'DOMAIN\username'; // в таком виде у меня приняло

 

в auth.php перед вызовом ldap_search мне пришлось добавить строчку

ldap_set_option($this->connection_id, LDAP_OPT_REFERRALS, 0)

подробнее сказано в http://ua.php.net/manual/en/function.ldap-search.php,

а если кратко, то без нее ldap_search вызывал "Operations error".

 

в самом вызове ldap_search обратите внимание на добавленные в конце массива поля

array( $this->login_conf['ldap_uid_field'], 'displayName', 'mail' )

именно тут можно указывать аттрибуты, которые будут использоваться ниже при создании локального пользователя,

только после этого они появятся в "$this->fields".

Ссылка на комментарий
Поделиться на других сайтах

  • 0

в 3.0.1 подключение к домену Active Directory было вылечено таким образом

в файле auth.php

		
	//-----------------------------------------
	// Win2K3 AD with root DN
	//-----------------------------------------

	if ( $this->ldap_config['ldap_opt_referrals'] )
	{
		@ldap_set_option( $this->connection_id, LDAP_OPT_REFERRALS, true );
	}

 

Изменено на

//-----------------------------------------
	// Win2K3 AD with root DN
	//-----------------------------------------

	if ( $this->ldap_config['ldap_opt_referrals'] )
	{
		@ldap_set_option( $this->connection_id, LDAP_OPT_REFERRALS, 0);
	}

 

 

Конфигурация следующая conf.php

 

 

<?php

 

$LOGIN_CONF['ldap_server'] = "ххх.ххх.ххх.ххх";

$LOGIN_CONF['ldap_port'] = "389";

$LOGIN_CONF['ldap_server_username'] = "user@domain.local";

$LOGIN_CONF['ldap_server_password'] = "password";

$LOGIN_CONF['ldap_uid_field'] = "samaccountname";

$LOGIN_CONF['ldap_base_dn'] = "DC=domain,DC=local";

$LOGIN_CONF['ldap_filter'] = "";

$LOGIN_CONF['ldap_server_version'] = "3";

$LOGIN_CONF['ldap_opt_referrals'] = "1";

$LOGIN_CONF['ldap_username_suffix'] = "";

$LOGIN_CONF['ldap_user_requires_pass'] = "0";

$LOGIN_CONF['ldap_display_name'] = "samaccountname";

$LOGIN_CONF['ldap_email_field'] = "mail";

$LOGIN_CONF['additional_fields'] = "";

 

?>

 

Все подключение произошло :D

 

Теперь алга с песней.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

 

Изменено на

//-----------------------------------------
	// Win2K3 AD with root DN
	//-----------------------------------------

	if ( $this->ldap_config['ldap_opt_referrals'] )
	{
		@ldap_set_option( $this->connection_id, LDAP_OPT_REFERRALS, 0);
	}

 

 

Немного не верно.

Правильнее будет так

 

if ( $this->ldap_config['ldap_opt_referrals'] )
{
   @ldap_set_option( $this->connection_id, LDAP_OPT_REFERRALS, true );
}else{
   @ldap_set_option( $this->connection_id, LDAP_OPT_REFERRALS, false );
}  

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.