angle-left

Правильная смена пароля юзера в Liferay 7.2

Доброе утро

Сегодня хочу описать проблему смены пароля пользователем в Liferay 7.2 с самописной регистрацией/авторизацией.

Проблема

Если в Liferay 7.2 после авторизации будет выставлен параметр passwordReset в значение true, то страница смены пароля начнёт ломаться.

Попытки решения

  1. Не выставлять пользователю поле passwordReset в значение true после авторизации.
  2. Создавать Ticket типа TYPE_PASSWORD для смены пароля пользователя.

Подробное описание

По требованию заказчика нам необходимо было написать кастомную регистрацию клиента. В момент перехода по определённой ссылке клиент должен автоматически зарегистрироваться и авторизоваться. Сервис регистрации был написан, но у пользователя выставлялся сгенерированный пароль. По итогу было решено добавить смену пароля после регистрации клиента. При изучении проблемы у юзера liferay было найдено поле passwordReset, которое после регистрации выставлялось в значение true. Далее пользователь автоматически авторизуется и должна была появляться страница смены пароля, предоставленная средствами liferay. 

Страница смены пароля появлялась, но на ней наблюдалось несколько проблем.

  1. Неправильный Content-Type в запрашиваемых CSS файлах
  2. После смены пароля liferay делал redirect на пустую страницу
  3. Некорректное отображение портлетов на странице смены пароля

Первая и третья проблема возникала из-за особенности поведения 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.