Одной из ключевых задач при работе с портлетами, создаваемыми на базе платформы Liferay, является разграничение прав доступа к действиям над портлетом и к частям функциональности самого портлета. Обычно, когда мы, будучи пользователем-администратором, добавляем на страницу портлет и переходим во вкладку "Permissions", на экране появляется следующее:
Это стандартная матрица ролей (Role) и доступных ей разрешений (Permissions). Так она выглядит по умолчанию, и если с добавлением новой роли проблем обычно не возникает (доступно напрямую из веб-интерфейса), то с добавлем столбца в эту таблицу все не так очевидно. При этом зачастую возникает потребность в создании дополнительных разрешений, специфичных для конкретного портлета, так как не всегда управление портлетом на основе стандарнтых View/Edit/Configuration представляется возможным.
В таком случае есть возможность определить собственные разрешения для портлета, которые бы расширяли стандартный набор. Для этого необходимо в вашем проекте с портлетами создать директорию src/main/resources/META-INF/resource-actions. В ней же мы задаем конфигурацию действий над ресурсами (нашими портлетами). В этой директории необходимо создать файл default.xml и определить в нем специфику разрешений на ресурс. Пример содержимого такого файла:
<?xml version="1.0"?>
<!DOCTYPE resource-action-mapping PUBLIC "-//Liferay//DTD Resource Action
Mapping 7.1.0//EN" "http://www.liferay.com/dtd/liferay-resource-action-mapping_7_1_0.dtd">
<resource-action-mapping>
<portlet-resource>
<portlet-name>DemoPortlet</portlet-name>
<permissions>
<supports>
<action-key>CONFIGURATION</action-key>
<action-key>VIEW</action-key>
<action-key>CUSTOM</action-key>
<action-key>EDIT</action-key>
<action-key>DELETE</action-key>
</supports>
<site-member-defaults>
<action-key>VIEW</action-key>
</site-member-defaults>
<guest-unsupported>
<action-key>CUSTOM</action-key>
</guest-unsupported>
</permissions>
</portlet-resource>
</resource-action-mapping>
В представленном XML мы добавили собственный ключ действия под названием CUSTOM для портлета под названием DemoPortlet. Кроме-того, мы сделали его недоступным для гостевых пользователей, которые не аутентифицированы на портале
Следующим шагом надо в директории src/main/resources (не переходя в META-INF) создать файл portlet.properties и указать в нем путь к конфигурации действий над ресурсами:
resource.actions.configs=META-INF/resource-actions/default.xml
При желании название файла также можно поменять.
Чтобы пользователям было удобно работать с новым разрешением, лучше задать перевод добавленному разрешению. Для этого в language override лайфрея необходимо добавить перевод ключу action.CUSTOM. Например
action.CUSTOM=Custom permission
После пересборки проекта вкладка разрешений у данного портлета должна будет выглядеть, как показано ниже. Добавился столбец с Custom permission, на это разрешение можно будет ориентироваться в дальнейшей разработке
Проверка на то, имеет ли портлет указанное разрешение, зависит во многом от архитектуры проекта. В общем виде вам нужны будут
- название разрешения (параметр actionId)
- id портлета (параметр portletId)
- название портлета (параметр portletName)
Тогда метод для проверки прав пользователя будет использовать com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil и выглядеть примерно так:
fun checkPortletPermission(
actionId: String,
portletId: String,
portletName: String,
user: User
): Boolean {
val permissionChecker = PermissionCheckerFactoryUtil.create(user)
return try {
permissionChecker.hasPermission(
GroupLocalServiceUtil.getCompanyGroup(permissionChecker.companyId),
portletName,
portletId,
actionId
)
} catch (e: NoSuchResourcePermissionException) {
log.error("No Resource Permission: ${e.message}")
false
} catch (e: IllegalArgumentException) {
log.error("Illegal argument, incorrect data for permission check: ${e.message}")
false
}
}
В нашем случае в качестве actionId будет выступать строка "CUSTOM", в качестве portletName - "DemoPortlet"
С portletId все несколько сложнее. Он имеет вид 17_LAYOUT_portlet_DemoPortlet_INSTANCE_4vtdfjqQCPhH. Это id можно увидеть, перейдя к Look and feel configuration портлета
Число 17 же означает идентификатор layout'а с портлетом и достается через themeDisplay.getPlid() со стороны клиента
Следуя данным инструкциям, у вас должно получиться добавить собственное разрешение для портлета и использовать его в коде вашего приложения