Доменная аутентификация (LDAP авторизация) - как?

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение rxu »

DRVTiny писал(а):вне зависимости от того, какую схему я выбираю, внизу ничегошеньки не меняется, все имена полей ввода начинаются с префикса LDAP, ни их состав, ни состояние (enabled/disabled) не меняется. По-моему здесь уже вполне очевидный и очень грубый баг в коде ACP phpBB 3.0.4 наблюдается.
Никакого бага. Задавайте параметры для LDAP, в чем проблема. Для других методов, очевидно, ничего задавать не требуется.
DRVTiny писал(а):в) LDAP-сервер радостно отвечает bindResponse'ом: success, т.е. всё в порядке, credentials приняты!
г) phpBB как-то несколько неожиданно выдаёт unbindRequest и соединение с сервером закрывается по обоюдному согласию сторон
А вот это более интересно. Но, как неспециалист в LDAP, пока ничего внятного сказать не могу. Надо смотреть код модуля аутентификации.

Добавлено спустя 10 минут 29 секунд:
/includes/auth/auth_ldap.php
Попробуйте убрать заглушку с вывода результатов отработки функции ldap_bind, а именно в строке

Код: Выделить всё

if (!@ldap_bind($ldap, $config['ldap_user'], htmlspecialchars_decode($config['ldap_password'])))
удалите @.
Вместо (тут же, следом)

Код: Выделить всё

return $user->lang['LDAP_NO_SERVER_CONNECTION'];
сделайте

Код: Выделить всё

echo 'Blablabla'; exit;
Исключительно в целях дебага. Потом всё можно будет вернуть на место.
Изображение
DRVTiny
phpBB 1.0.0
Сообщения: 2
Стаж: 17 лет 4 месяца

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение DRVTiny »

Поменял модуль LDAP-аутентификации, от этого, к сожалению, ничего не изменилось.
Мало того, в коде модуля я вижу проверку на пустое поле пароля, так что по идее-то при незаполненном поле LDAP password мне должно вываливаться сообщение об ошибке. А не тут-то было, в действительности модуль аутентификации без зазрения совести так и пытается выполнить bindRequest с пустым паролем!
А не знаете, есть какие-нибудь средства пошаговой отладки PHP-скриптов? Ну или просто средства более-менее адекватной отладки?
burchik
phpBB 1.0.0
Сообщения: 4
Стаж: 17 лет 4 месяца
Откуда: Санкт-Петербург

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение burchik »

Сейчас тоже устанавливал корпоративный форум с LDAP авторизацией.

Проблем никаких не возникло, если не заполнять поле "Фильтр имени пользователя LDAP".
Как только я заполняю данное поле, выдается сообщение о не возможности установить соединение, как и DRVTiny.

Грешу на то, что при авторизации рут юзером на сервере ldap к нему применяется такой же фильтр, как и к пользователям (хотя как это может быть?...)

Пока в код не лез - сейчас буду смотреть что и как там происходит.

Но установил один факт - если данное поле пустое, то никаких проблем не возникает.

После сообщений DRVTiny думаю, что косяк происходит именно при выборке пользователя - не корректно работает фильтр, т.к. по данным сниффера авторизация на сервере ldap проходит нормально.

Как только разберусь с проблемой - постараюсь отписаться тут.

Также есть некоторый вопрос к местным профи: Мне необходимо автоматически проставлять статусы пользователям на основе данных из LDAP для разделения прав доступа к разделам форума (не создавать же отдельные форумы для каждой категории пользователей... ). Подскажите, пожалуйста, как это лучше сделать? (Мельком просмотрел посты по добавлению выводимого имени из ldap - в принципе понятно в какую сторону капать, но подсказка по поводу установки прав будет очень кстати (думаю делать так: при авторизации - затираем старые права юзеру и пишем из новые на основе данных из ldap).
burchik
phpBB 1.0.0
Сообщения: 4
Стаж: 17 лет 4 месяца
Откуда: Санкт-Петербург

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение burchik »

Разобрался с работой фильтров.

Необходимо было порыться в коде и вот что нашел:

Функция ldap_user_filter($username) работает так:
В начале ставится (&(uid=username)(ВАШ ФИЛЬТР))
(место (uid=username) может быть (cn=username) и т.п. - в зависимости от того, что вы указали в настройках авторизации)
А вот с фильтром надо поступать так:
Если фильтрация только по одному параметру - просто вводите свой параметр без скобок - как в примере: objectClass=posixGroup

А вот если нужно разрешить вход пользователям по нескольким фильтрам, то
НЕ УКАЗЫВАЙТЕ СКОБКУ В НАЧАЛЕ И В КОНЦЕ - за вас эти скобки уже поставил разработчик модуля.

Пример фильтра по нескольким полям: objectClass=posixGroup)(mail=my@mail.ru

Вот такой вот маленький баг обнаружился...
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение rxu »

burchik
Если это баг, надо сообщить разработчикам. Можете разложить конкретно, баг - в том-то, должно быть - так-то? Отправим в багтрекер.
Изображение
burchik
phpBB 1.0.0
Сообщения: 4
Стаж: 17 лет 4 месяца
Откуда: Санкт-Петербург

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение burchik »

Обычно фильтры пишутся вот так примерно:
(&(sn=Jensen)(givenName=Barbara)) - документация по фильтрам - http://www.mozilla.org/directory/csdk-docs/filter.htm

В принципе то, что написано в функции ldap_user_filter файла includes/auth/auth_ldap.php удовлетворяет этим условиям, но есть одно большое НО.

Конструкция $filter = "(&$filter({$config['ldap_user_filter']}))";
{$config['ldap_user_filter']} - это наш фильтр, заданный в админке.
Как писал в посте выше - для одного фильтра все нормально, а вот если нужно указать несколько фильтров, то приходиться "нарушать" правильный синтаксис фильтров и не указывать крайние скобочки.

У меня в голове есть 2 варианта устранения:
1. Проверка при сохранении настройки LDAP - если скобочки стоят по краям - то убрать их автоматически. Это самый простой вариант - не могу написать в каком файле и что нужно подправить, т.к. пока не очень разобрался со файловой архитектурой.

2. Требовать от пользователя указания полного фильтра - с обязательными скобочками и заменить строчку в функции ldap_user_filter
с $filter = "(&$filter({$config['ldap_user_filter']}))";
на $filter = "(&".$filter."{$config['ldap_user_filter']})";

Первый вариант самый простой - если бы знал где копать, то написал бы более подробно (просто на самом деле в качестве программиста первый раз полез смотреть как устроено все изнутри..)

rxu, по поводу моего вопроса об автоматическом добавлении в группы не поможете советом?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение rxu »

Как правильно должны указываться несколько фильтров (пример строки)?
burchik писал(а):по поводу моего вопроса об автоматическом добавлении в группы не поможете советом?
Пока нет, к сожалению, в ldap ни в зуб ногой. К тому же, из связки с ldap в phpBB3 есть только модуль аутентификации, больше ничего. Как получать сведения о группах - вообще без понятия.
Изображение
burchik
phpBB 1.0.0
Сообщения: 4
Стаж: 17 лет 4 месяца
Откуда: Санкт-Петербург

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение burchik »

Правильно вот так:
(&(uid=Jensen)(givenName=Barbara)(c=ru))
Первый символ - ампресанд.

Тут мы выбираем пользователя Jensen по uid - параметр по которому выбираем - поле "Идентификационный номер LDAP [ uid ]" в настройке аутентификации.

Далее мы, предположим хотим, чтобы авторизоваться могли только пользователи с именем Barbara и которые находятся в стране ru.
Итоговый фильтр, который передается в ldap - (&(uid=Jensen)(givenName=Barbara)(c=ru)

Рассмотрим функцию ldap_user_filter:

Код: Выделить всё

/**
* Generates a filter string for ldap_search to find a user
*
* @param	$username	string	Username identifying the searched user
*
* @return				string	A filter string for ldap_search
*/
function ldap_user_filter($username)
{
	global $config;

	$filter = '(' . $config['ldap_uid'] . '=' . ldap_escape(htmlspecialchars_decode($username)) . ')';
	if ($config['ldap_user_filter'])
	{
		$filter = "(&$filter({$config['ldap_user_filter']}))";
	}
	return $filter;
}
В переменную filter сначала помещается значение (uid=Jensen) - состоит из названия поля в LDAP, в котором хранится логин, и имени юзера.
Далее если задан дополнительный фильтр в настройке ldap авторизации - "Фильтр имени пользователя LDAP:", то в фильтр дополнительно добавляется указанная там строка.
В конце возвращаем сформированный фильтр

Пример №1.

Код: Выделить всё

В фильтре указали: givenName=Barbara

На выходе функции получили: (&(uid=Jensen)(givenName=Barbara))
Тут все правильно и никаких проблем нет.

Если мы хотим добавить несколько фильтров, то тогда:

Пример №2.

Код: Выделить всё

В фильтре указали: (givenName=Barbara)(c=ru)

На выходе функции получили: (&(uid=Jensen)((givenName=Barbara)(c=ru)))
Получаются лишние скобки вокруг нашего фильтра.

В этом вся проблема и заключается.


________________________________________
По поводу моего вопроса про группы - предположим, я заранее создам все группы и буду знать кому в какую группу надо. Как мне автоматически прописать пользователю, что он состоит в этой группе?... (Нужные выборки из ldap сделать - это для меня не проблема...)
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение rxu »

burchik писал(а):Получаются лишние скобки вокруг нашего фильтра.
В этом вся проблема и заключается.
Сообщено разработчикам, bug #45315.
Изображение
knik
phpBB 1.0.0
Сообщения: 3
Стаж: 15 лет 9 месяцев

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение knik »

А как быть с возможностью аутентификации пользователей из нескольких доменов?
knik
phpBB 1.0.0
Сообщения: 3
Стаж: 15 лет 9 месяцев

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение knik »

Вот что мне по этому поводу написали :

"PHP does a standard LDAP lookup, so if you set the DN info correctly, it can lookup anything in your AD. Now, based on what I'm seeing on the LDAP information page, you may need to make a small modification to handle this. It looks like to search multiple DNs you need to pass an array instead of a string for the ldap_serch call."

И описание http://www.php.net/manual/en/function.l ... .php#94554.

Становится вопрос. Возможно ли записать в строках в настройках Аутентификации форума (в админском интерфейсе) этот массив вместо строки для ldap_serch,
или необходимо (если возможно) подредактировать сам форум (auth_ldap.php и проч.) - где и как это сделать?
s6669
phpBB 1.0.0
Сообщения: 1
Стаж: 15 лет 7 месяцев

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение s6669 »

последняя на текущий момент верси 3.0.8 поддерживает ldap аутентификацию, но при попытке ее использовать выдает 3 типа ошибок, в зависимости от подставляемых даных:
  1. Попытка связи с сервером LDAP с указанным именем или паролем не удалась.
  2. Не удалось найти идентификатор входа в систему для admin@sb_domain.
  3. Произошла ошибка при поиске в директории LDAP.
Кто нибудь с этим втречался? Используется связка Apache+MySql+PHP (APPSERV). Может я чтото с исходными данными путаю?
Имя сервера LDAP:ldap://192.168.204.129
Порт сервера LDAP:389
Основное имя LDAP [ dn ]:DC=SB_DOMAIN
Идентификационный номер LDAP [ uid ]:uid
Фильтр имени пользователя LDAP:
Email-атрибут LDAP:
Пользователь LDAP [ dn ]:uid=admin@SB_DOMAIN
Пароль LDAP:*********
knik
phpBB 1.0.0
Сообщения: 3
Стаж: 15 лет 9 месяцев

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение knik »

в дполнение к этой ветке, можно почитать тут Аутентификация на форуме через Active Directory
cmit
phpBB 1.0.0
Сообщения: 3
Стаж: 15 лет 5 месяцев

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение cmit »

У меня следующий вопрос:
Поднял форум на phpbb, (авторизация средствами LDAP). Пользователи проходят авторизацию на форуме используя имя и пароль учетных записей заведенных в Active Directory. Дабы облегчить жизнь пользователям, обращаюсь к вам за советом и прошу помочь реализовать сквозную авторизацию на форуме. При которой, пользователю прошедшего успешную авторизацию в Домене, уже не потребуется вводить идентичный логин/пароль на форуме.
Аватара пользователя
Alek$
Former team member
Сообщения: 2616
Стаж: 21 год 1 месяц
Откуда: Новосибирск
Поблагодарили: 37 раз

Re: Доменная аутентификация (LDAP авторизация) - как?

Сообщение Alek$ »

cmit
Это практически нереально, поскольку для идентификации авторизованного пользователя форум использует cookies, а к данным учетной записи компьютера, на котором он сидит, форум получить не может технически. Это изначально заложенное во все браузеры ограничение безопасности.
Единственный возможный для вас вариант - это при логине пользователя в учетную запись компьютера запускать скрипт, который будет через браузер посылать запрос на авторизацию на форуме, а потом закрывать браузер. Но вам придется либо заставить пользователей пользоваться одним браузером, либо адаптировать этот скрипт индивидуально исходя из браузера, которым пользуется тот или иной пользователь.
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.

Вернуться в «Поддержка phpBB 3.0.х»