Доброе утро
Сегодня хочу описать проблему смены пароля пользователем в Liferay 7.2 с самописной регистрацией/авторизацией.
Проблема
Если в Liferay 7.2 после авторизации будет выставлен параметр passwordReset в значение true, то страница смены пароля начнёт ломаться.
Попытки решения
- Не выставлять пользователю поле passwordReset в значение true после авторизации.
- Создавать Ticket типа TYPE_PASSWORD для смены пароля пользователя.
Подробное описание
По требованию заказчика нам необходимо было написать кастомную регистрацию клиента. В момент перехода по определённой ссылке клиент должен автоматически зарегистрироваться и авторизоваться. Сервис регистрации был написан, но у пользователя выставлялся сгенерированный пароль. По итогу было решено добавить смену пароля после регистрации клиента. При изучении проблемы у юзера liferay было найдено поле passwordReset, которое после регистрации выставлялось в значение true. Далее пользователь автоматически авторизуется и должна была появляться страница смены пароля, предоставленная средствами liferay.
Страница смены пароля появлялась, но на ней наблюдалось несколько проблем.
- Неправильный Content-Type в запрашиваемых CSS файлах
- После смены пароля liferay делал redirect на пустую страницу
- Некорректное отображение портлетов на странице смены пароля
Первая и третья проблема возникала из-за особенности поведения liferay при выставлении passwordReset в значение true и если сам пользователь уже авторизован. В данном случае liferay на все запросы к самописным портлетам начинает возвращать страницу смены пароля. В том числе и на запрашиваемые CSS файлы. Из-за этого мы наблюдали неправильный Content-Type (text/html вместо text/css) и некорректное отображение портлетов.
Вторая проблема, как первая и третья, связана с необычным поведением для liferay. Предполагалось, что пользователь не может авторизоваться, если он захотел сменить пароль.
Для решения этой проблемы мы решили не авторизовывать пользователя сразу после регистрации, а создать Ticket с типом TicketConstants.TYPE_PASSWORD.
Ticket ticket = TicketLocalServiceUtil.addTicket(companyId,
User.class.getName(), registeredUser.getUserId(),
TicketConstants.TYPE_PASSWORD, null, plusDay(new Date()),
serviceContext);
После создания тикета мы делаем redirect пользователя на страницу смены пароля.
String redirectLink = serviceContext.getPortalURL() + serviceContext.getPathMain() +
"/portal/update_password?p_l_id=" + 0 +
"&ticketKey=" + ticket.getKey();
httpServletResponse.sendRedirect(redirectLink);
Пользователь переходит на страницу смены пароля, меняет свой пароль и автоматически авторизуется, но теперь уже стандартными средствами liferay, без изменения руками поля passwordReset.