null

Пара важных заметок об импорте пользователей LDAP в Liferay

Сегодня мы снова обратимся к Liferay (а именно к версиям семейства 7.4.3), чтобы обозначить несколько не самых очевидных, но в то же время важных моментов, касающихся процесса автоматического импорта пользователей на портал. В данной заметке мы не будем повторять существующие руководства (например это) и останавливаться на описании процесса интеграции портала Liferay с каталогом пользователей LDAP, а ограничимся лишь двумя наблюдениями, которые я нашел полезными для решения часто возникающих проблем и их отладки.

Интервалы запуска импорта пользователей

В первую очередь, при настройке импорта пользователей может смутить обстоятельство, что в панели управления пункт "LDAP" есть и в системных настройках (System settings), и в настройках экземпляров (Instance settings). В общем случае вкладку системных настроек в этом случае можно не трогать, настраивая в настройках экземлпяров связь с AD во вкладке "Servers". После этого, когда связь с сервером установлена, перейдя в "Import" можно наблюдать следующую картину:

Если первые два чекбокса не вызывают вопросов (они включают импорт), то поля Import Interval и Lock Expiration Time могут их вызвать, по крайней мере по той причине, что никаких единиц измерения времени здесь не указано. Интервал импорта на самом деле обозначен в минутах, однако это не значит, что импорт происходит каждые 10 минут. На самом деле он происходит раз в день, активируясь только тогда, когда истечет время Lock Expiration Time. Оно уже, в свою очередь, представлено в милисекундах, и значение по умолчанию представляет собой целые сутки. Таким образом, если вы хотите изменить периодичность импорта, то данное условие необходимо учитывать (не забывайте при этом, что и сам процесс импорта также занимает некоторое время).

В то же время аналогичный интерфейс вас будет ждать и в System Settings -> LDAP -> Import. Если вы решили поменять Lock Expiration Time или Import interval, то для предсказуемого и понятного поведения импорта лучше будет их изменить и в настройках системы, и в настройках экземляров одновременно, чтобы значения и там и там были одинаковыми. Если же временной интервал окажется больше в настройках Instance, то Liferay, пытаясь запустить импорт по настройкам System, сможет это сделать лишь тогда, когда пройдет интервал, указанный в Instance.

Может возникнуть закономерный вопрос, как по необходимости запустить импорт пользователей вручную в обход всех интервалов. Многие рекомендуют воспользоваться встроенным интерфейсом лайфрея для написания скриптов: перейти в Server Administration -> Script, выбрать там Javascript и ввести команду для вызова импорта, указанную здесь. Проблема в том, что данное решение подходит для устаревшего Liferay 6.x. Если же мы откроем интерфейс скриптинга в Liferay 7, то увидим, что по умолчанию доступен только Groovy:

На момент написания статьи написать рабочий скрипт для ручной работы с импортом пользователей в актуальных версиях Liferay не удалось. Возможно мы вернемся к этому позже в одной из следующих статьей!

Куда смотреть в исходники и особенности обработки полного имени

Если при импорте происходят ошибки, то надо внимательно читать логи. Предположим мы видим в логе что-то похожее на:

<log4j:event logger="com.liferay.portal.security.ldap.internal.exportimport.LDAPUserImporterImpl" timestamp="1747988944179" level="ERROR" thread="SystemExecutorServiceUtil-6">

<log4j:message><![CDATA[Unable to import user <SOME USER DATA>]]></log4j:message>

И stacktrace ниже. Несмотря на то, что разобраться в написанном бывает сложно, стоит внимательно смотреть на строки и названия файлов, где бросаются исключения. Обычно это происходит в одном из классов пакета exportimport (опять же на момент написания статьи, когда актуальный лайфрей - 7.4.3.132). Сам по себе поиск нужного фрагмента в исходном коде Liferay может занять какое-то время, поэтому в этой статье оставляю ссылку на найденную директорию, содержимое которой должно прояснить суть проблем, возникающих при импорте:

https://github.com/liferay/liferay-portal/tree/7.4.3.132-ga132/modules/apps/portal-security/portal-security-ldap-impl/src/main/java/com/liferay/portal/security/ldap/internal/exportimport

Так например, по коду стало ясно, что при отсутствии прямо заданной фамилии Liferay берет составляющие fullname (обычно cn в LDAP) и делит его на 3 части - имя  - отчество - фамилию. Поэтому если полное имя состоит не из ФИО, а, скажем, из двух слов, то лайфрей выкинет исключение "java.lang.ArrayIndexOutOfBoundsException: 2", поскольку полное имя при разделении содержит только два элемента, а не три.

Next