Ограничение к файлам mediaSource для анонимных пользователей frontend

Есть mediaSource с basePath = "/assets/components/dbd/files/" куда из моего компонента грузятся файлы и линкуются с записями в БД.

Вопрос: Как сделать так, что бы файлы из каталога "/assets/components/dbd/files/" не были доступны анонимным(не авторизованным) пользователям? А авторизованным в modx и имеющим определенную роль были доступны.



Пример:
Если создать файл test.txtt положить по пути /assets/components/dbd/files/ то он свободно будет доступен по url: site_url + /assets/components/dbd/files/test.txt без авторизации на сайте.
Vladimir Alekhin
06 августа 2021, 23:02
modx.pro
215
0

Комментарии: 3

Артур
07 августа 2021, 20:20
0
Я думаю надо создать новый источник файлов и дать к нему доступ только нужной вам группе пользователей.
    Vladimir Alekhin
    07 августа 2021, 23:41
    +1
    Это уже другой источник файлов, проблема в том, что контроль доступа туда работает только в админке MODX. Файлы загруженные в эту папку доступны по прямой ссылке любому пользователю (в том числе анонимному), либо я настроил не правильно.

    Сделал временное решение, но мне оно не очень нравится. описываю решение:
    в папку которая указана в basePath положил файл .htaccsess т.к. сервер на apache2 со строкой
    deny from all
    Что запретило доступ к файлам по прямой ссылке всегда, но php имеет к ним доступ.

    Поэтому создал сниппет с кодом:
    <?php
    $file_url = $modx->getOption('assets_path') . 'components/dbd/files/' . $filename;
    
    if (!is_file($file_url)) { return false; }
    
    header('Content-Type: application/octet-stream');
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
    ob_clean();
    flush();
    readfile($file_url); 
    exit();
    Тут мы обращаемся к имени файла переданного в сниппет и выдаем его в буфер вывода с соответствующими заголовками.

    Вызвал сниппет [[!file_download?&filename=`[[!#GET.fn]]`]] передал ему get параметр содержащий имя файла. Сниппет вызван на странице которая принадлежит группе ресурсов на которую настроен доступ только для авторизованных.

    Вроде работает, но уверен есть решение лучше. Оставлю это тут, если кто-то будет искать подобное решение, и надеюсь что более опытные пользователи посмотрят решение и предложат лучшую альтернативу.
      Александр Мельник
      08 августа 2021, 15:30
      0
      Да, вы правы. Кроме как запрещать доступ через настройки вебсервера и отдавать файлы через readfile() с проверкой прав, на его просмотр — по другому и не решить данный вопрос.
      Я буквально недавно решал подобную задачу, в рамках микрофреймворка slim и там было проще, в том плане, что сама архитектура фреймворка позволяет все файлы приложения хранить на уровень ниже, чем публичная директория, куда смотрит веб сервер, поэтому получить файл по прямой ссылке просто невозможно.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3