Strapi — потрясающая безголовая CMS, а с ее версией 4 все стало еще лучше. Однако в версии 3 уже возникала проблема с незащищенным обслуживанием чего-либо в вашей папке /public. Вы можете подумать, что это не проблема, поскольку папка говорит, что ее содержимое должно быть общедоступным, верно? Неправильно, потому что все, что вы загружаете через интерфейс Strapi в Медиатеку или практически везде в Content-Manager, идет прямо в /public/uploads

Итак, почему это проблема?

Представьте, что вы используете Strapi в качестве серверной части для системы выставления счетов или чего-то еще с личными и секретными файлами. Если вы загрузите их через серверную часть Strapi, они сразу же будут доступны на странице yourwebsite.com/uploads/filename.ext.

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

В версии 3 было достаточно перезаписать путь /uploads из любого места, но в версии 4 это уже невозможно, так как все имеет префикс /api. , поэтому невозможно перезаписать поведение. После долгих исследований и чтения фактического кода Strapi (преимущества открытого исходного кода) я нашел рабочее решение, перезаписав маршрут Strapi по умолчанию:

Давайте исправим это

Вы можете сделать это в любом месте вашего кода, но я предлагаю сделать это как расширение плагина загрузки, чтобы все было организовано. Итак, давайте начнем:

  1. В своем проекте перейдите к /src/extensions/upload (или создайте путь, если он не существует).
  2. Создайте файл с именем strapi-server.js.
  3. Добавьте следующий код:

Итак, что мы здесь делаем?

В строках 4–7 мы создаем некоторые значения по умолчанию, они равны значениям по умолчанию Strapi. Затем начинаем экспортировать плагин:

Строка 9: Возьмите defaultIndex и maxAge, если они были установлены где-то еще.

Строка 11: вызовите функцию strapi.server.routes, чтобы перезаписать любой из маршрутов по умолчанию. (Проверьте node_modules/@strapi/strapi/lib/middlewares/public/index.js, если хотите узнать, что еще можно перезаписать)

Строки 13–18: определяет, какой маршрут мы перезаписываем, и кто обрабатывает вызовы, в данном случае это служба Koa Static, которая обрабатывает все.

Строка 21–30: Это самое интересное. Вы можете добавить сюда политику любого типа (дополнительную информацию см. здесь: Strapi Docs ). В этом случае мы просто ищем первый параметр (который является вызываемым маршрутом, например, /uploads/test.txt) и проверяем, содержит ли он определенный расширение, например .текст. Опять же, ничего особенного, но вы можете добавить сюда любую политику, которая вам нужна! Возвращает true, если доступ должен быть предоставлен, и false, если нет.

Вот и все! Вы защитили свой маршрут /uploads с помощью собственной политики. Для меня до сих пор остается загадкой, почему это недоступно по умолчанию в Strapi, но, по крайней мере, вы можете обойти это таким образом!

Удачного программирования!