Как запретить пользователям загружать изображения в AEM без прохождения через DAM.

DAM (Digital Asset Manager) - это система управления активами AEM, которая должна быть единой точкой входа для всех активов на платформу AEM и универсальным магазином для использования этих активов в контенте.

DAM выходит за рамки простого хранения активов, предоставляя полезные функции, такие как проверка активов, управление лицензиями, теги и аналитика, среди многих других. Даже если вы не используете эти функции, есть много причин, по которым вы хотите убедиться, что все ваши активы находятся в одном месте и под одной и той же системой управления:

  1. Активы легко найти, особенно если у вас есть разумная структура каталогов или используется функция коллекций.
  2. Если вы хотите запустить рабочие процессы (например, проверку содержимого) или выполнить какую-либо обработку новых активов, это можно сделать при создании актива DAM.
  3. Если вам нужно переместить активы с другой платформы или на другую платформу, интеграция станет простой.

Однако пользователи могут обойти DAM, используя то, что я считаю «лазейками» в компонентах OOTB, для прямой загрузки файлов (обычно изображений) в определенные места в JCR прямо со своего компьютера без необходимости помещать этот файл в плотина.

Если изображение петли выше напоминает вам веревку палача, это не случайно! Если оставить эти лазейки открытыми, это может привести к загрязнению JCR, содержащего «оборотные средства», что, например, может стать серьезной проблемой для любого типа пакетной работы и иметь разрушительное влияние на размер JCR в долгосрочной перспективе.

Компонент изображения сайтов AEM

Давайте сначала рассмотрим самую вопиющую лазейку: параметр обзор компонента Image.

Вот что происходит, если вы используете кнопку загрузки для предоставления изображения:

Изображение сохраняется на уровне страницы, а не в DAM, что затрудняет его поиск в будущем. Представьте себе, что одно и то же изображение с высоким разрешением используется в 10 местах, и каждый раз пользователи загружают из своей системы: теперь вы храните 10 изображений вместо того, чтобы сохранять их один раз в DAM и ссылаться на них 10 раз.

Размер страницы на скриншоте CRXDE выше составляет 7,3 МБ со ссылкой на DAM и 3,1 МБ с загруженным изображением (это увеличение в 424 раза)!

Также существует потенциальная угроза безопасности при использовании этого метода предоставления изображений. Пользователь, имеющий доступ к конфиденциальной информации и чип на своем плече, может использовать функцию просмотра для загрузки текстового файла, замаскированного как JPEG, который после публикации будет доступен для внешнего мира. Я разыграл этот сценарий на GIF-изображении ниже:

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

Еще не убедили? Давайте посмотрим, как мы можем «отключить» эту функцию.

Вариант 1. Для конкретного компонента

Самый «чистый» способ сделать это - использовать свойство allowUpload компонента /libs/cq/gui/components/authoring/dialog/fileupload для вашего компонента Image. Установка для этого свойства значения false приведет к удалению кнопки просмотра.

Если вы используете основные компоненты AEM, вы можете сделать это, скопировав узел в /apps/core/wcm/components/image/v2/image/cq:dialog/content/items/tabs/items/asset/items/columns/items/column/items/file в свой компонент изображения и просто добавив к нему следующее свойство:

allowUpload  -  Boolean  -  false

Вариант 2: глобально

Если вы предпочитаете полностью удалить эту функциональность, вы можете сделать это, наложив JSP на /libs/cq/gui/components/authoring/dialog/fileupload/render.jsp и просто удалив код, который считывает свойство allowUpload и отображает кнопку просмотра.

Вот образец, но посмотрите репозиторий GitHub для полного рефакторинга JSP:

Компоненты AEM Forms Image и Image Choice

Те же проблемы существуют для компонентов AEM Forms Image и Image Choice:

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

Большие части cq:dialog деревьев узлов обоих компонентов были отмечены миксином granite:InternalArea, чтобы указать, что они не могут быть расширены и не могут быть наложены. Это также делает их серыми в CRXDE:

Поскольку мы не можем изменять эти узлы напрямую, мы создадим клиентскую библиотеку CSS, чтобы предотвратить рендеринг кнопок.

Создайте структуру узлов, аналогичную следующей:

apps
 \ — customization (nt:folder)
     \ — clientlibs (nt:folder)
         \ — restrict-asset-upload (cq:ClientLibraryFolder)
             \ — css.txt (nt:file)
             \ — css (nt:folder)
                 \ — restrictAssetUpload.css (nt:file)

Добавьте в css.txt следующее:

#base=css
restrictAssetUpload.css

Мы можем изменить содержимое restrictAssetUpload.css, чтобы реализовать нашу функцию. Следующий CSS скроет кнопки Загрузить:

Теперь мы должны убедиться, что этот CSS загружен вместе с остальными клиентскими библиотеками, связанными с экраном Forms Editor.

Существующие стили для двух компонентов находятся в /libs/fd/af/authoring/clientlibs/granite/components/imageUploadStyles clientlib, который находится в категорииimageUpload. Чтобы загрузить наш CSS одновременно, мы поместим его в ту же категорию, чтобы он был подхвачен AEM и объединен с другими стилями. Добавьте следующее свойство к узлу restrict-asset-upload:

categories — String[] — imageUpload

Теперь перезагрузите редактор форм AEM и откройте боковую панель конфигурации для компонента изображения, и вы должны увидеть, что кнопка «Загрузить» исчезла.

Вы увидите то же самое для Image Choice.

Конечно, это не мешает технически подкованному пользователю проверить DOM в своем браузере, удалить свойство display: none; CSS и нажать кнопку «Загрузить», но это хорошее начало. Если вы хотите пройти лишнюю милю, процесс будет таким же, за исключением того, что вы создадите клиентскую библиотеку JS, которая удаляет кнопку «Загрузить» из модели DOM.

Эскизы страниц сайтов AEM

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

Однако, если вы хотите удалить эту функцию, вы можете сделать это следующим образом.

Вариант 1. Для определенного компонента страницы

Создайте следующую структуру узлов под компонентом страницы:

your-page-component/tabs/thumbnail/items/column/items/thumbnail

Затем под ним создайте узел типа nt:unstructured с именем upload и присвойте ему следующее свойство:

sling:hideResource  -  Boolean  -  true

Вариант 2: глобально

Если вы предпочитаете удалять загружаемые миниатюры со всех страниц независимо от их типа или шаблона страницы, вы можете сделать это, наложив файл на /apps/cq/gui/components/common/wcm/pagethumbnail/pagethumbnail.jsp и внося следующие изменения, чтобы удалить кнопку (код см. В репозитории GitHub в нижней части статьи) :

Итак, ваш JCR теперь защищен от «плавающих» активов!

Чтобы увидеть исходный код для модификаций JSP, перейдите в репозиторий GitHub для этого руководства.

Если вы можете вспомнить какие-либо другие случаи, когда пользователи могут загружать изображения (или любой ресурс) без использования DAM, прокомментируйте ниже, и я добавлю исправление в эту статью :)