null

Смена URL профиля пользователя Liferay

Разрабатывая корпоративные порталы на базе решения Liferay, нам постоянно приходится комбинировать использование стандартных средств платформы и собственных портлетов и разработок. Одним из ярких примеров, когда это оказывается необходимо, является портлет блогов (дневников). Из коробки Liferay предоставляет такую полезную и часто используемую функциональность как создание различных новостных постов, заметок о важных событиях, относящихся к комании, и прочих текстовых записей. В то же время зачастую появляется потребность в изменении поведения стандартного портлета, в правках внешнего вида, в изменении некоторых ссылок и прочем. Часть этих проблем решается механизмами hook'ов, о чем есть статьи на нашем сайте, но сегодня о другом.

Не так давно находились в следующей ситуации. Когда пользователь портала оставлял комментарии к записям в блогах, при нажатии на его ФИО открывалась стандартная страница профиля лайфреевского пользователя, тогда как для отображения деталей профиля и действий с ним в системе был создан отдельный портлет. Подобное положение дел никого не устраивало. Вот так выглядят комментарий в портлете блогов и стандартная страница профиля при переходе к пользователю из нее:

Выглядит страница My Profile не очень презентабельно. В данном примере информация о пользователе заполнена не до конца, но даже с заполненным полем About ситуация существенно не меняется. И как же тогда поменять ссылку, которая открывается при нажатии на пользователя из портлета блогов, чтобы она вела на другую страницу, специально созданную под профиль?

В Liferay для такого предусмотрено свойство users.profile.friendly.url. Вы можете задать значение этого свойства в portal-ext.properties и перезапустить портал для применения изменений. Но самое интересное то, что в это поле можно записать не просто некий статичный путь, но и указать собственный API-эндпоинт, который будет принимать запросы на переход к пользователю из стандартных портлетов, при необходимости будет осуществлять какую-либо промежуточную логику, а в конце перенаправлять уже на нужную страницу профиля. Это может быть особенно полезно в тех случаях, когда портал интегрируется с уже существующей цифровой средой; когда все внутренние портлеты разрабатываются с опорой не на внутренние идентификаторы пользователей Liferay, а на иные идентификаторы сотрудников, полученные из сторонних корпоративных систем.

В итоге нам нужно сделать следующее. Во-первых, внести изменения в portal-ext.properties. Добавить туда:

auth.token.ignore.origins= /o/portal-api/profiles/from-liferay
users.profile.friendly.url=/o/portal-api/profiles/from-liferay?liferay_user_id=${liferay:userId}

Собственно наш эндпоинт, являющийся частью отдельного модуля, имеет путь /o/portal-api/profiles/from-liferay. Именно по этому пути и будет производиться переход к профилю. В фигурных скобках через особый синтаксис передается также и значение параметра запроса -- внутренний идентификатор пользователя на портале.

Во-вторых, нам нужен собственно и сам эндпоинт. Представим типовой несколько упрощенный код такого контроллера:

@Path("/profiles")
class PortalProfilesController: BaseController() {
    private val employeeService: PortalEmployeeService 

    @GET
    @Path("/from-liferay")
    fun getPortalProfileByLiferayProfile(
        @Context request: HttpServletRequest,
        @QueryParam("liferay_user_id") liferayUserId: Long
    ): Response {
        val user = UserServiceUtil.getUserById(liferayUserId)
        val employee = employeeService.getByUser(user);
        val redirect = URI("${"http://localhost:8080/profile"}?id=${employee.getId()}")
        return Response.status(Response.Status.FOUND).location(redirect).build()
    }
}

Представленный выше код помогает нам найти сущность сотрудника компании (не из лайфрея, а на уровне нашей бизнес-логики) через id пользователя Liferay. Далее мы создаем редирект на страницу profile, где располагается уже наш портлет с профилем, который использует корпоративный id сотрудника вместо того, который ему присвоил портал. "Захардкоженный" localhost тут представлен в качестве примера, данный URL можно также получать через свойства портала или иные программные методы.

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

Вперед

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

 

Работаю Java\Kotlin Backend Developer в компании Tune-it. На работе занимаюсь проектами, связанными с Liferay, NiFi, Spring Framework, а вне работы - философской антропологией