Перейти к контенту
  • 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 );
}  

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

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

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

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

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

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

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

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

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