null

Наследование прав доступа в библиотеке документов Liferay 6.2

Библиотека документов Liferay предназначена для хранения различных пользовательских файлов: документов, аудиозаписей, изображений и т.д. Она имеет привычную иерархическую структуру каталогов с настраиваемыми правами доступа для каждого каталога и файла в отдельности. Права доступа к ресурсу привязаны к роли пользователя.

Одна из известных проблем при работе с библиотекой документов заключается в том, что создаваемые подкаталоги не наследуют права доступа от родительского каталога. Вследствие этого права приходится выставлять вручную для каждого нового каталога. Это касается как создания каталогов через веб-интерфейс в разделе Site Administration - Documents and Media, так и их создания программным путём.

Для создания каталогов и файлов используются методы класса com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil. Ниже приведён код простого портлета, создающего каталог с именем Test и его подкаталоги с заданным именем.

public class DLTestPortlet extends MVCPortlet {

  public void addSubFolder(ActionRequest request, ActionResponse response) {
    String name = ParamUtil.getString(request, "folderName");
    ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
    User usr = themeDisplay.getUser();
    long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;

    ServiceContext serviceContext;

    try {
      serviceContext = ServiceContextFactory.getInstance(DLFolder.class.getName(), request);
      Folder testFolder = checkOrCreateFolder("Test", parentFolderId, "", serviceContext);
      checkOrCreateFolder(name, testFolder.getFolderId(), "", serviceContext);
      SessionMessages.add(request, "subfolder-added");
    } catch (Exception ex) {
      SessionErrors.add(request, "subfolder-not-added");
      System.out.println("ERROR: " + ex.getMessage());
    }
    SessionMessages.add(request, PortalUtil.getPortletId(request)
                + SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
  }
    
  private Folder checkOrCreateFolder(String name, long parentFolderId, String folderDescription, ServiceContext sc) throws PortalException, SystemException {
    Folder folder;
    long userId = sc.getUserId();
    long repositoryId = sc.getScopeGroupId();
        
    try {
      folder = DLAppLocalServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, name);
    } catch (PortalException pe) {
      folder = DLAppLocalServiceUtil.addFolder(userId, repositoryId, parentFolderId, name, folderDescription, sc);
    }
    return folder;
  }
}

 

Создадим каталог Folder1.


Если всё прошло без ошибок, в разделе Documents and Media появится новый каталог с именем Test и вложенным в него каталогом Folder1. Права доступа у них одинаковые - доступ есть только у владельца.

 

Можно поменять права доступа на каталог Test и добавить в него ещё один подкаталог. Права доступа к новому подкаталогу останутся такими же, как у Folder1. То есть на них никак не влияют права каталога Test.

В API Liferay 6.2 нет возможности указать, что при создании нового каталога мы хотим по умолчанию назначать ему такие же права, как у его родителя. Поэтому копирование прав родительского каталога приходится делать вручную. Ниже приведён исправленный метод добавления подкаталога.

private Folder checkOrCreateFolder(String name, long parentFolderId, String folderDescription, ServiceContext sc) throws PortalException, SystemException {
        Folder folder;
        long userId = sc.getUserId();
        long repositoryId = sc.getScopeGroupId();
        
        try {
            folder = DLAppLocalServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, name);
        } catch (PortalException pe) {
            folder = DLAppLocalServiceUtil.addFolder(userId, repositoryId, parentFolderId, name, folderDescription, sc);
            List<ResourcePermission> permissionsList = ResourcePermissionLocalServiceUtil.getResourcePermissions(
                      folder.getCompanyId(), DLFolder.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
                      "" + parentFolderId);
                
            for (ResourcePermission rp : permissionsList) {
                ResourcePermissionLocalServiceUtil.addResourcePermissions(rp.getName(), 
                        RoleLocalServiceUtil.getRole(rp.getRoleId()).getName(), 
                        ResourceConstants.SCOPE_INDIVIDUAL, 
                        rp.getActionIds());
            }
        }
        return folder;
    }


Теперь можно создать ещё один подкаталог каталога Test и убедиться, что изменённые права доступа были унаследованы.