Предварительная версия плагина LDAP 0.2.0

Здравствуйте. Три месяца назад я писал краткий пост о начале разработки плагина Ldap for Livestreet. За это время произошло много изменений в сообществе лайвстрит, а также появился форк лайвстрита AltoCMS.
В плагине LDAP также произошли изменения.

Начнем с самого начала:
Плагин «LDAP» позволяет использовать altocms/livestreet в качестве корпоративного сайта, портала и т.д. Вообщем он позволяет пользователям использовать не внутреннюю авторизацию движка, а авторизацию Active Directory, используемую на фирмах, предприятиях для удобства управления пользователями внутри предприятия.

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

Изменения в конфиге.

Если в первой версии плагина с настраиваемыми полями все было плохо, то теперь для системного администратора появилась возможность синхронизировать как стандартные поля(почта, логин, ГЕО-данные) так и любые пользовательские поля(скайп, телефон, факс и тд), то есть плагин стал более гибок в настройке полей.

вот пример конфига для настройки полей

/*
 * Настройки для профиля (пользовательские поля)
 * basic - базовые настройки
 * userfield - пользовательские поля.
 *
 * Используйте с осторожностью
 */

$config['profile']['basic'] = array(
    'setLogin' => 'samaccountname',
    'setMail' => 'mail',
    'setProfileName' => 'displayname',
    'setProfileCountry' => 'co',
    'setProfileRegion' => 'st',
    'setProfileCity' => 'l',
);

$config['profile']['userfield'] = array(
    'phone'=> 'mobile',
    'skype' => 'telephonenumber',
);


в config[profile][basic] используются заготовки сущностей oUser->setMail() и тд. При этом следует иметь в виду, что для правильной регистрации и логина пользователя поля setLogin и setMail ОБЯЗАТЕЛЬНО должны быть заполнены.

Регистрация внешнего пользователя.



ВНИМАНИЕ: Поскольку база пользователей используется одна, и проверяется первоначально пользователи в AD, то при регистрации пользователя, совпадающего с пользователем внешним, он будет перезатерт данными из AD.

Синхронизация пользователей


Появилась мини-админка для синхронизации пользователей из AD. В ней можно принудительно синхронизировать пользователей AD. (Я уже говорил, что синхронизация пользователя происходит в момент логина?)
Есть как быстрая, так и отложенная синхронизация (через Cron). Быстрая в основном нужна для единичной синхронизации. Для массовой необходимо использовать крон!

Ну вот и все изменения на текущий момент.

Мне все также требуются системные администраторы для тестировании плагина на продакшн-системах.

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

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

avatar
Только что поставил на отдельный сервер чистый LiveStreet, установив туда только модуль ldap. Настроил, провел с несколькими пользователями из AD синхронизацию. Они в списке пользователей LiveStreet появились и наследовали поля. Попытка зайти под этими пользователями не привела к успеху — при вводе логина/пароля анимированый индикатор входа бегает, но дальше дело не идет. И выйдя admin'ом — назад зайти не дает ошибка — «Что-то не так! Вероятно, неправильно указан логин (e-mail) или пароль.»
В какую сторону смотреть? И используется в модуле префикс кеширования, отличный от дефолтного?
avatar
спасибо за багрепорт.
как вариант, попробуйте поставить firefox с firebug поставить, и отследить на вкладке console какая ошибка в этот момент.
Как то так
avatar
Ошибка в консоли firebug'а:
SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE user_id='3'' at line 3 at /var/www/plugins/ldap/classes/modules/ldap/mapper/Ldap.mapper.class.php line 91
Array
(
    [code] => 1064
    [message] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE user_id='3'' at line 3
    [query] => 
			SELECT user_id
			FROM 
			WHERE user_id='3'
		
    [context] => /var/www/plugins/ldap/classes/modules/ldap/mapper/Ldap.mapper.class.php line 91
)

Сервер — Ubuntu Server 13.04
MySQL — 5.5.31-0ubuntu0.13.04.1
Кодировка сервера: UTF-8 Unicode (utf8)
PHP 5.4.9-4ubuntu2
Apache/2.2.22
avatar
хм. такое ощущение что либо конфиг файл некорректен, либо таблицы неправильно подгрузились. у вас есть таблица prefix_user_ad?
avatar
у вас есть таблица prefix_user_ad?
это не показатель в данной ошибке.
ПРедлагаю показать конфиг плагина который на сайте
avatar
Как видно из ошибки
[query] => 
			SELECT user_id
			FROM 
			WHERE user_id='3'

возникает вопрос — а из какой таблицы он будет делать выборку?
В 87 строке /ldap/classes/modules/ldap/mapper/Ldap.mapper.class.php указано: FROM ".Config::Get('db.table.user_ad'."

И еще одно — все пользователи из AD становятся женского пола — нужно куда-то добавить строку: 'setProfileSex' => 'other'
avatar
да-да, я тоже это заметил. при этом они в статистике не становятся женщинами. видно глюк движка :)
Но при импорте надо добавить, да
avatar
Есть таблицы site_user_ad, site_ad_cron и site_ad_log со структурой описанной в db.sql — только они не содержат записи и их я создавал самостоятельно запросом в MySQL'е.
Удалил эти три таблицы — при активации плагина таблицы не создаются (из-за закомментированной строки в PluginLdap.class.php). Попробовал раскомментировать эту строку и активировать плагин — вывалилась ошибка:
SQL Error: Can't DROP 'user_mail'; check that column/key exists at /var/www/engine/modules/database/Database.class.php line 160
Array ( [code] => 1091 [message] => Can't DROP 'user_mail'; check that column/key exists [query] => ALTER TABLE gszn_user DROP INDEX user_mail [context] => /var/www/engine/modules/database/Database.class.php line 160 )

Конфиг думаю верен — так как список пользователей получает и при синхронизации создает пользователя в базе LiveStreet и заполняет поля: логин, майл и имя.
avatar
всетаки покажите конфиг. т.к. у меня ощущение что у Вас нету вот этой строчки: github.com/kurosavals/ldap/blob/master/config/config.php.example#L7
avatar
И действительно нет этих строк в config.php Прописал, деактивировал-активировал модуль. Попробовал зайти не синхронизированным пользователем — анимированый индикатор входа бегает, но при перезагрузки страницы пользователь оказался! авторизован!
Firebug выдал такую ошибку:
POST http://10.20.0.5/login/ajax-login/
	
200 OK
		109ms	
8814d8...5e59.js (строка 2)
ЗаголовкиPostОтветCookies

<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/var/www/plugins/ldap/classes/modules/ldap/Ldap.class.php</b> on line <b>211</b><br />
<br />
<b>Notice</b>:  Undefined index: code in <b>/var/www/plugins/ldap/classes/actions/ActionLogin.class.php</b> on line <b>44</b><br />
{"sUrlRedirect":"http:\/\/10.20.0.5\/","sMsgTitle":"","sMsg":"","bStateError":false}
avatar
покажите конфиг ибо я думаю что тепер у вас не настроены поля ЗДЕСЬ: github.com/kurosavals/ldap/blob/master/config/config.php.example#L53
avatar
<?php

/*
 *  Настройки подключения к Active Directory
 */

Config::Set('db.table.user_ad', '___db.table.prefix___user_ad');
Config::Set('db.table.ad_cron', '___db.table.prefix___ad_cron');

//список доменных контроллеров
$config['ad']['domain_controllers'] = array("dc.gszn.local"); //array("dc1.example.com","dc2.example.com")

// DN для поиска
$config['ad']['base_dn'] = "OU=GU,DC=dc,DC=gszn,DC=local"; //OU=Users,DC=example,DC=com

// суффикс подключения
$config['ad']['account_suffix'] = "@dc.gszn.local"; //@example.com

//Учетные данные для подключения
$config['ad']['admin_username'] = "yubelyakov"; //admin
$config['ad']['admin_password'] = "Gfhjkm"; //password

// Используемая аутентификация. ssl и tls вместе не работают!
$config['ad']['use_ssl'] = false;
$config['ad']['use_tls'] = false;


//порт для соединения
$config['ad']['ad_port'] = "";

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

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

$config['profile']['basic'] = array(
    'setLogin' => 'samaccountname',
    'setMail' => 'mail',
    'setProfileName' => 'displayname',
//    'setProfileSex' => 'other',
);

return $config;

?>

Вот конфиг.
avatar
github.com/kurosavals/ldap/blob/master/config/config.php.example#L53 так и есть, дозаполните поля
avatar
Ничего не изменилось. Пользователи AD входят после перезагрузки страницы логина, автоматом не редиректится.
Плюс — если выйти администратором сайта, то потом невозможно войти (используя логин или эл.почту).
avatar
Ничего не изменилось. Пользователи AD входят после перезагрузки страницы логина, автоматом не редиректится.
Плюс — если выйти администратором сайта, то потом невозможно войти (используя логин или эл.почту).
покажите еще раз Firebug
avatar
свежий после изминений
avatar
покажи firebug. видимо на чем то спотыкается. есть подозрение, что на geo модуле
avatar
От обычного пользователя:
<br />
<b>Notice</b>:  Undefined index: code in <b>/var/www/plugins/ldap/classes/actions/ActionLogin.class.php</b> on line <b>44</b><br />
{"sUrlRedirect":"http:\/\/10.20.0.5\/","sMsgTitle":"","sMsg":"","bStateError":false}

При попытки зайти админом:
{"sMsgTitle":null,"sMsg":"\u0427\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a! \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d \u043b\u043e\u0433\u0438\u043d (e-mail) \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c.","bStateError":true}
avatar
мой косяк, братиш, забыл спушить изменения в гитхаб.

Посмотри последний апдейт, там пофиксено
avatar
Переустановил модуль.
Теперь пользователи нормально входят и админом входить можно.
1. Нужно пофиксить пол пользователя, а то все женского пола стали.
2. При ручной синхронизации не отображает что прошла синхронизация. Firebug дает ошибку:
POST http://10.20.0.5/admin/ajaxldapimport/  200 OK  109ms	
8814d8...5e59.js (строка 2)

<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/var/www/plugins/ldap/classes/modules/ldap/Ldap.class.php</b> on line <b>211</b><br />
{"bState":true,"sMsgTitle":"\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435","sMsg":"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d","bStateError":false}
avatar
понял. завтра пофиксю. спасибо за багрепорт
avatar
avatar
Поставил, проверил.
Если убрать из конфига строки
$config['profile']['userfield'] = array(
    'phone'=> 'mobile',
    'skype' => 'telephoneNumber',
);

то опять не заходит пользователем AD без перезагрузки страницы. С этими строками все ок.
И напоминаю про пол пользователей.
avatar
Я понял. в ближайшие дни устраню баг, устаканю версию 0.2, вполне возможно, что дальше разработка будет вестись только под alto. Я просто хочу наконец забацать нормальную админку для плагина :)
avatar
Ну, админка думаю это не проблема. в aceAdminPanel можно будет запилить пунктик
avatar
А смысл использовать кэширование? LDAP вызывается только в момент логина, после чего пользователь на время сессии кэшируется
avatar
и пользователем можно зайти не только синхронизированным, синхронизация нужна лишь для заполнения базы пользователями
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.