Бесплатный плагин LDAP (AD) for Livestreet 1.x версия 0.0.1

Здравствуйте. Решил поделиться для сообщества своей наработкой для livestreet

Плагин «LDAP for Livestreet» позволяет использовать livestreet в качестве корпоративного сайта, портала и т.д. Вообщем он позволяет пользователям использовать не авторизацию livestreet, а авторизацию Active Directory.

Плагин пока недоработан, потому в каталог выкладывать не буду. Вот код на гитхабе
github.com/kurosavals/ldap

Прошу прощения, что пишу в личный блог, нехватает кармы для блога «доп модули и доработки».

Под катом описание работы, нюансы и недостатки



Итак. Плагин позволяет авторизовываться в LiveStreet, используя авторизацию Active Directory. В момент логина используется sAMAccountName и UserPassword, на их основе проверяется авторизация AD, после чего в БД создается пользователь с логином, равным значению «sAMAccountName», электропочтой из аттрибута mail, и именем пользователя равным displayName
Дальше один нюанс: Пароль. К сожалению (или к счастью) доменный контроллер не отдает значения UserPassword, даже его хэш, ни при каких условиях, потому я нашел такой выход из ситуации — в момент создания пользователя в бд испольуется функция
$sNewPassword = md5(func_generator(7));

которая создает фиктивный пароль в БД.
Если же пользователь существует, то в момент логина, все его данные обновляются

Заглянем в конфиг. В основном все должно быть понятно, объясню лишь несколько настроек:
//список доменных контроллеров
$config['ad']['domain_controllers'] = array();

В этой строчку указываете доменный контроллер (или контроллеры, если их несколько). Массив использовать обязательно. Домен для коннекта выбирается случайным образом, потому нагрузки сильной не должно быть.

следующая настройка:
// суффикс подключения
$config['ad']['account_suffix'] = ""; //@example.com

у некоторых может быть тут проблемы. Здесь необходимо указать ваш лес
например если вы используете лес work.local, то суффикс будет выглядеть как @work.local
Это очень важно, если забудете указать, то при бинде LDAP подключения, получите отлуп

// Группы для администраторов
$config['security']['admin_groups'] = array("Администраторы домена");

Здесь вроде бы все ясно. Указываете список групп, члены которых будут являтся администраторами LiveStreet (только пользователи! не компьютеры). При логине пользователь проверяется на принадлежность этим группам по принципу: Если входит и на текущий момент администратором LS не является, то делаем его админом. Если невходит и является администратором — удаляем из админов.

Ну и последний пункт конфига
/*
* Настройки для профиля (пользовательские поля)
* На текущий момент вместо имен используются id полей
*/

$config['profile'] = array(
    '1'=> 'mobile',
);

При логине на основе этих данных заполняются пользовательские поля. Стоит объяснить. В данном случае «1» — это ид пользовательского поля «телефон» (идет по умолчанию в ls 1.0.2). 'mobile' — это аттрибут пользователя.
Получается, что в поле телефон будет подставляться значение телефон из АД.

Вроде бы все понятно и просто.

ВНИМАНИЕ: Важная информация.
Данный плагин отключает регистрацию и функцию «забыли пароль?». Во избежание проблем с внешними пользователями.
Также, пришлось убрать индексы с таблицы prefix_user.user_mail поскольку поле mail в AD является необязательным, и что самое важное — неуникальным.
Данный плагин переопределяет EventReminder, EventAjaxLogin, и экшен ActionRegistration полностью, плюс делегирует файл шаблона window_login.tpl, так что имеется явная несовместимость с плагинами типа openID, loginza и тому подобных.

Планы:
Чего хотелось бы сделать?
1. Написать скрипт синхронизации AD с БД полностью, по крону, а не только в момент авторизации.
2. Хотелось бы заиметь добровольцев, которые помогут оттестировать баги, и новые функции.
3. двустороннюю связь между LS и LDAP (меняем профиль на сайте — меняется инфа в AD)
4. Был бы признателен, если бы кто-то помог с плагином. у самого практически нет времени.

Спасибо за внимание

12 комментариев

avatar
Плюсую однозначно.
К стати там используется библиотека adLDAP судя по названию он для AD. Вы пробовали ее использовать с OpenLDAP? Работает нормально?
avatar
первую версию этого плагина писал на коленке, потому искал готовую имплементацию LDAP. Планирую к релизу переписать весь класс, но пока времени нет.

У нас AD2008, но по сути с openLDAP должно нормально работать, вот вроде решение проблемы
github.com/nilsteampassnet/TeamPass/issues/98
avatar
я так понял, вы используете openLDAP, можете подсказать, есть ли в структуре openLDAP поле samaccountname, или что используется для его замены?
avatar
О чем плагин и зачем он нужен? не нашел этого в посте, если это только для просвященных, тогда простите, удаляюсь..)
avatar
Итак. Плагин позволяет авторизовываться в LiveStreet, используя авторизацию Active Directory.
Это для просвященных, да :) В смысле первый почин интеграции лайстрит в энтерпрайс
avatar
да я умею читать :) ну ок, я просто имел в виду, что описание надо давать, словно пишете для тупых, так сможете привлечь людей, которые раньше не слышали об этом. Сейчас же непросвященные и ленивые, как я, пройдут дальше, т.к. не поймут, что плагин собсно делает :)
avatar
пост писал сумбурно, поэтому не учел. Плагин нужен для внедрения Livestreet на предприятия, так сказать для потеснения на этом поприще битрикса. К релизу плагина думаю подготовлю официальный пресс-релиз, чтобы не было недосказанности
avatar
В идеале хотелось бы чтобы.Пользователи АД и ЛС были независимыми. Для этого в таблицу пользователей можно добавить поле is_ad tinyint(1) и по нему делать определение принадлежности пользователя к АД\ЛС далее надо копать функцию
Authorization(ModuleUser_EntityUser $oUser,$bRemember=true,$sKey=null)

модуля User на предмет того чтобы не надо было вообще копировать юзерей из АД в ЛС. Я думаю что это релизуемо но детально не разбирался.
avatar
Переопределить функцию EventAjaxLogin класа ActionLogin
по примеру:
protected function EventAjaxLogin() {
    if(is_ADUser(sUserLogin)){
       ............авторизируем АД
    } else {
       parent::EventAjaxLogin();
    }
}
avatar
чтобы не надо было вообще копировать юзерей из АД в ЛС
я думал об этом. но придется переписывать полдвижка. Очень много завязано на функцию GetUserByLogin. например тотже логин. то есть в базу его придется в любом случае писать.

А отключить внешних пользователей вынудило то, что появилась вероятность, что имя пользователя будет занято
avatar
Ну для этого можно переопределить функцию. GetUserByLogin.
Хотя да, работы немерянно
avatar
Там не только это. Внутренние сообщения. посты, топики, всё завязано на id пользователя в БД, от этого никуда не деться. Вроде бы :)
Хотя у меня появилась мысль, как добавить внешних пользователей, написать синхронизатор для импорта существующих пользователей LDAP, после этого уже можно пробовать выводить внешних пользователей. за наводку спасибо. Но остается вопрос с дублированием электропочты, что делать с ней?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.