null

Добавление собственных разрешений в Liferay портлеты

Одной из ключевых задач при работе с портлетами, создаваемыми на базе платформы 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()​​​​​​​ со стороны клиента

Следуя данным инструкциям, у вас должно получиться добавить собственное разрешение для портлета и использовать его в коде вашего приложения