null

Только без паники! Отключаем LDAP-аутентификацию в Liferay прямо в БД

Как известно, портал на базе Liferay можно сконфигурировать таким образом, чтобы пользователи аутентифицировались по протоколу LDAP с использованием того, или иного LDAP-сервера. Эта опция очень часто используется - благо, в панели управления порталом реализован удобный интерфейс настройки аутентификации.

При всём этом, она содержит в себе одни хорошо скрытые от начинающего администратора "грабли" - если он включил в Панели управления принудительную аутентификацию пользователей через LDAP и ошибся где-то в настройках соединения с сервером, после закрытия портальной сессии в браузере он не сможет больше зайти на портал и, соответственно, не сможет отключить LDAP-аутентификацию. Получается замкнутый круг - чтобы отключить LDAP, нужно зайти на портал под администратором, а чтобы зайти под администратором, нужно отключить LDAP. Обычно, осознав это, начинающий администратор начинает паниковать и совершает много необдуманных поступков вплоть до сноса портала и переустановки его "с нуля".

Паника!

Тем не менее, решение есть - т.к. портал сохраняет все свои настройки в БД, можно изменить конфигурацию прямо там, не аутентифицируясь на портале. Об этом способе решения проблемы отключения "криво" сконфигурированной LDAP-аутентификации и пойдёт речь в моей сегодняшней заметке.

Постановка задачи

Итак, представим, что мы начинающий администратор портала на Liferay. Для конкретики возьмём Liferay 6.1.2, использующий в качестве хранилища данных БД под управлением M$ SQL Server (довольно часто используемая сегодня конфигурация).

Мы зашли на портал, открыли Панель управления и наконфигурировали что-то непонятное в настройках LDAP-аутентификации:

Какой-то странный LDAP-сервер

После этого мы вышли с портала и поняли, что авторизоваться мы больше не можем - LDAP сконфигурирован некорректно, вследствие чего аутентификация работать перестала:

Не пущает!

Ищем нужные таблицы

Не будем паниковать и попробуем отключить LDAP-аутентификацию напрямую в БД. Для начала, нам нужно определить, где портал хранит информацию о том, используется ли LDAP. Установим на тестовую машину "чистый" Liferay 6.1.2 и посмотрим, что меняется в БД при включении и отключении LDAP-аутентификации.

Чтобы не проделывать лишнюю работу, скачаем портал в бандле с Tomcat'ом и посмотрим отличия в дефолтной БД на базе HSQL. В этом варианте данные хранятся в файле прямо в виде SQL-запросов; соответственно, даже дамп снимать не надо - достаточно просто сравнить два состояния БД.

Итак, запускаем портал и кликаем "Finish" в мастере конфигурации:

Мастер конфигурации

Теперь снимаем бэкап базы - создаём резервную копию файла $PORTAL_HOME/data/hsql/lportal.log, в котором хранится БД:

jek@jek-laptop:~/liferay-portal-6.1.2-ce-ga3/data$ cp hsql/lportal.log lportal.default.log

Идём в Панель управления, включаем LDAP (просто устанавливаем 2 флажка):

Включаем LDAP

На всякий случай, снова снимаем бэкап базы:

jek@jek-laptop:~/liferay-portal-6.1.2-ce-ga3/data$ cp hsql/lportal.log lportal.ldap.log

Теперь сравниваем 2 состояния БД:

jek@jek-laptop:~/Загрузки/liferay-portal-6.1.2-ce-ga3/data$ diff lportal.default.log lportal.ldap.log 
4818,4856d4817
< DELETE FROM ACCOUNT_ WHERE ACCOUNTID=7
< INSERT INTO ACCOUNT_ VALUES(7,1,5,'','2013-08-16 11:59:46.048000','2015-09-16 21:54:05.983000',0,'Liferay','Liferay, Inc.','','','','','','','')
< DELETE FROM LAYOUTSETPROTOTYPE WHERE LAYOUTSETPROTOTYPEID=10412
< INSERT INTO LAYOUTSETPROTOTYPE VALUES('556cb5ea-a3d9-49cd-a15f-c9cf38efc04b',10412,1,'2015-09-16 21:33:24.312000','2015-09-16 21:54:05.986000','<?xml version=''1.0'' encoding=''UTF-8''?><root available-locales="en_US" default-locale="en_US"><Name language-id="en_US">Community Site</Name></root>','Site with Forums, Calendar and Wiki','layoutsUpdateable=true\u000a','1')
< DELETE FROM LAYOUTSETPROTOTYPE WHERE LAYOUTSETPROTOTYPEID=10438
< INSERT INTO LAYOUTSETPROTOTYPE VALUES('cc046471-e626-4608-ab6e-a245a79fefa4',10438,1,'2015-09-16 21:33:25.396000','2015-09-16 21:54:05.986000','<?xml version=''1.0'' encoding=''UTF-8''?><root available-locales="en_US" default-locale="en_US"><Name language-id="en_US">Intranet Site</Name></root>','Site with Documents, Calendar and News','layoutsUpdateable=true\u000a','1')
< DELETE FROM PORTALPREFERENCES WHERE PORTALPREFERENCESID=10248
> INSERT INTO PORTALPREFERENCES VALUES(10248,1,1,'<portlet-preferences><preference><name>ldap.auth.enabled</name><value>true</value></preference><preference><name>ldap.auth.required</name><value>true</value></preference><preference><name>ldap.server.ids</name><value></value></preference><preference><name>admin.email.password.reset.subject</name><value>[$PORTAL_URL$]: Reset Your Password</value></preference><preference><name>admin.email.user.added.subject</name><value>[$PORTAL_URL$]: Your New Account</value></preference><preference><name>admin.email.password.sent.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your new password for [$PORTAL_URL$] is [$USER_PASSWORD$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$] with the browser [$USER_AGENT$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.verification.subject</name><value>[$PORTAL_URL$]: Email Address Verification</value></preference><preference><name>admin.default.role.names</name><value>Power User[$NEW_LINE$]User</value></preference><preference><name>admin.email.password.sent.subject</name><value>[$PORTAL_URL$]: Your New Password</value></preference><preference><name>admin.email.password.reset.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]You can reset your password for [$PORTAL_URL$] at [$PASSWORD_RESET_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.verification.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Please verify your email address for [$PORTAL_URL$] at [$EMAIL_VERIFICATION_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your verification code is [$EMAIL_VERIFICATION_CODE$] Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.no.password.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$]. Your password is [$USER_PASSWORD$]. Enjoy!&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference></portlet-preferences>')
< COMMIT
< DELETE FROM PORTALPREFERENCES WHERE PORTALPREFERENCESID=10248
> INSERT INTO PORTALPREFERENCES VALUES(10248,1,1,'<portlet-preferences><preference><name>company.security.strangers.verify</name><value>false</value></preference><preference><name>ldap.auth.enabled</name><value>true</value></preference><preference><name>ldap.auth.required</name><value>true</value></preference><preference><name>ldap.server.ids</name><value></value></preference><preference><name>admin.email.password.reset.subject</name><value>[$PORTAL_URL$]: Reset Your Password</value></preference><preference><name>admin.email.user.added.subject</name><value>[$PORTAL_URL$]: Your New Account</value></preference><preference><name>admin.email.password.sent.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your new password for [$PORTAL_URL$] is [$USER_PASSWORD$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$] with the browser [$USER_AGENT$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.verification.subject</name><value>[$PORTAL_URL$]: Email Address Verification</value></preference><preference><name>admin.default.role.names</name><value>Power User[$NEW_LINE$]User</value></preference><preference><name>company.security.strangers.with.mx</name><value>true</value></preference><preference><name>company.security.auto.login</name><value>true</value></preference><preference><name>company.security.site.logo</name><value>true</value></preference><preference><name>admin.email.password.sent.subject</name><value>[$PORTAL_URL$]: Your New Password</value></preference><preference><name>admin.email.password.reset.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]You can reset your password for [$PORTAL_URL$] at [$PASSWORD_RESET_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>company.security.send.password</name><value>true</value></preference><preference><name>admin.email.verification.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Please verify your email address for [$PORTAL_URL$] at [$EMAIL_VERIFICATION_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your verification code is [$EMAIL_VERIFICATION_CODE$] Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.no.password.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$]. Your password is [$USER_PASSWORD$]. Enjoy!&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>company.security.strangers</name><value>true</value></preference><preference><name>company.security.auth.type</name><value>emailAddress</value></preference></portlet-preferences>')

Видим, что нужные нам конфиги хранятся в таблице PORTALPREFERENCES (в виде аццкого XML). Уже результат!

Определяем нужные параметры инициализации портала

Тем не менее, это ещё не совсем то, что нам нужно - нам нужно промоделировать ситуацию, когда LDAP сначала был включён, а потом его отключили, а не наоборот. OK - снова идём в Панель управления, отключаем LDAP (оба флажка) и снимаем бэкап:

jek@jek-laptop:~/liferay-portal-6.1.2-ce-ga3/data$ cp hsql/lportal.log lportal.noldap.log

Снова сравниваем 2 состояния БД:

jek@jek-laptop:~/liferay-portal-6.1.2-ce-ga3/data$ diff lportal.noldap.log lportal.ldap.log 
4818,4856d4817
< DELETE FROM ACCOUNT_ WHERE ACCOUNTID=7
< INSERT INTO ACCOUNT_ VALUES(7,1,5,'','2013-08-16 11:59:46.048000','2015-09-16 21:54:05.983000',0,'Liferay','Liferay, Inc.','','','','','','','')
< DELETE FROM LAYOUTSETPROTOTYPE WHERE LAYOUTSETPROTOTYPEID=10412
< INSERT INTO LAYOUTSETPROTOTYPE VALUES('556cb5ea-a3d9-49cd-a15f-c9cf38efc04b',10412,1,'2015-09-16 21:33:24.312000','2015-09-16 21:54:05.986000','<?xml version=''1.0'' encoding=''UTF-8''?><root available-locales="en_US" default-locale="en_US"><Name language-id="en_US">Community Site</Name></root>','Site with Forums, Calendar and Wiki','layoutsUpdateable=true\u000a','1')
< DELETE FROM LAYOUTSETPROTOTYPE WHERE LAYOUTSETPROTOTYPEID=10438
< INSERT INTO LAYOUTSETPROTOTYPE VALUES('cc046471-e626-4608-ab6e-a245a79fefa4',10438,1,'2015-09-16 21:33:25.396000','2015-09-16 21:54:05.986000','<?xml version=''1.0'' encoding=''UTF-8''?><root available-locales="en_US" default-locale="en_US"><Name language-id="en_US">Intranet Site</Name></root>','Site with Documents, Calendar and News','layoutsUpdateable=true\u000a','1')
< DELETE FROM PORTALPREFERENCES WHERE PORTALPREFERENCESID=10248
< INSERT INTO PORTALPREFERENCES VALUES(10248,1,1,'<portlet-preferences><preference><name>ldap.server.ids</name><value></value></preference><preference><name>admin.email.password.reset.subject</name><value>[$PORTAL_URL$]: Reset Your Password</value></preference><preference><name>admin.email.user.added.subject</name><value>[$PORTAL_URL$]: Your New Account</value></preference><preference><name>admin.email.password.sent.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your new password for [$PORTAL_URL$] is [$USER_PASSWORD$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$] with the browser [$USER_AGENT$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.verification.subject</name><value>[$PORTAL_URL$]: Email Address Verification</value></preference><preference><name>admin.default.role.names</name><value>Power User[$NEW_LINE$]User</value></preference><preference><name>admin.email.password.sent.subject</name><value>[$PORTAL_URL$]: Your New Password</value></preference><preference><name>admin.email.password.reset.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]You can reset your password for [$PORTAL_URL$] at [$PASSWORD_RESET_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.verification.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Please verify your email address for [$PORTAL_URL$] at [$EMAIL_VERIFICATION_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your verification code is [$EMAIL_VERIFICATION_CODE$] Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.no.password.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$]. Your password is [$USER_PASSWORD$]. Enjoy!&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference></portlet-preferences>')
< COMMIT
< DELETE FROM PORTALPREFERENCES WHERE PORTALPREFERENCESID=10248
< INSERT INTO PORTALPREFERENCES VALUES(10248,1,1,'<portlet-preferences><preference><name>company.security.strangers.verify</name><value>false</value></preference><preference><name>ldap.server.ids</name><value></value></preference><preference><name>admin.email.password.reset.subject</name><value>[$PORTAL_URL$]: Reset Your Password</value></preference><preference><name>admin.email.user.added.subject</name><value>[$PORTAL_URL$]: Your New Account</value></preference><preference><name>admin.email.password.sent.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your new password for [$PORTAL_URL$] is [$USER_PASSWORD$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$] with the browser [$USER_AGENT$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.verification.subject</name><value>[$PORTAL_URL$]: Email Address Verification</value></preference><preference><name>admin.default.role.names</name><value>Power User[$NEW_LINE$]User</value></preference><preference><name>company.security.strangers.with.mx</name><value>true</value></preference><preference><name>company.security.auto.login</name><value>true</value></preference><preference><name>company.security.site.logo</name><value>true</value></preference><preference><name>admin.email.password.sent.subject</name><value>[$PORTAL_URL$]: Your New Password</value></preference><preference><name>admin.email.password.reset.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]You can reset your password for [$PORTAL_URL$] at [$PASSWORD_RESET_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]The request for a new password was made from [$REMOTE_ADDRESS$] / [$REMOTE_HOST$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>company.security.send.password</name><value>true</value></preference><preference><name>admin.email.verification.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Please verify your email address for [$PORTAL_URL$] at [$EMAIL_VERIFICATION_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Your verification code is [$EMAIL_VERIFICATION_CODE$] Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.no.password.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$].&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>admin.email.user.added.body</name><value>Dear [$TO_NAME$],&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Welcome! You recently created an account at [$PORTAL_URL$]. Your password is [$USER_PASSWORD$]. Enjoy!&lt;br /&gt;[$NEW_LINE$]&lt;br /&gt;[$NEW_LINE$]Sincerely,&lt;br /&gt;[$NEW_LINE$][$FROM_NAME$]&lt;br /&gt;[$NEW_LINE$][$FROM_ADDRESS$]&lt;br /&gt;[$NEW_LINE$][$PORTAL_URL$]</value></preference><preference><name>company.security.strangers</name><value>true</value></preference><preference><name>company.security.auth.type</name><value>emailAddress</value></preference></portlet-preferences>')

Видим, что из конфигурации "исчезли" 2 параметра - ldap.auth.enabled и ldap.auth.required. То же самое нам нужно сделать и на продакшне!

Отключаем LDAP-аутентификацию

Останавливаем портал на продкашне. Открываем SQL Server Management Studio, цепляемся к базе. Сходу пишем такой запрос:

UPDATE [lportal].[dbo].[PortalPreferences]
  SET preferences = REPLACE(preferences,'<preference><name>ldap.auth.enabled</name><value>true</value></preference>','')
  WHERE preferences like '%<preference><name>ldap.auth.enabled</name><value>true</value></preference>%';
UPDATE [lportal].[dbo].[PortalPreferences]
  SET preferences = REPLACE(preferences,'<preference><name>ldap.auth.required</name><value>true</value></preference>','')
  WHERE preferences like '%<preference><name>ldap.auth.required</name><value>true</value></preference>%';

Получаем на выходе ругань о несовместимости типов:

Msg 8116, Level 16, State 1, Line 2
Argument data type ntext is invalid for argument 1 of replace function.

Гуглим, находим вопрос на StackOverflow. Правим запросы:

UPDATE [lportal].[dbo].[PortalPreferences]
  SET preferences = CAST(REPLACE(CAST(preferences as NVarchar(MAX)),'<preference><name>ldap.auth.enabled</name><value>true</value></preference>','') AS NText)
  WHERE preferences like '%<preference><name>ldap.auth.enabled</name><value>true</value></preference>%';
UPDATE [lportal].[dbo].[PortalPreferences]
  SET preferences = CAST(REPLACE(CAST(preferences as NVarchar(MAX)),'<preference><name>ldap.auth.required</name><value>true</value></preference>','') AS NText)
  WHERE preferences like '%<preference><name>ldap.auth.required</name><value>true</value></preference>%';

Запросы отработали нормально! Осталось сбросить пароль суперпользователю. Для этого воспользуемся советом, описанным в заметке моего коллеги, и установим нужному пользователю хэш пароля "test" прямо в БД. Для этого найдём запись пользователя в БД и установим ему в поле password_ значение qUqP5cyxm6YcTAhz05Hph5gvu9M=.

Запускаем портал, пытаемся авторизоваться - ура, теперь всё прошло успешно!

Аутентификация прошла успешно

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.