Ограничение к файлам 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 без авторизации на сайте.
Вопрос: Как сделать так, что бы файлы из каталога "/assets/components/dbd/files/" не были доступны анонимным(не авторизованным) пользователям? А авторизованным в modx и имеющим определенную роль были доступны.
Пример:
Если создать файл test.txtt положить по пути /assets/components/dbd/files/ то он свободно будет доступен по url: site_url + /assets/components/dbd/files/test.txt без авторизации на сайте.
Комментарии: 3
Я думаю надо создать новый источник файлов и дать к нему доступ только нужной вам группе пользователей.
Это уже другой источник файлов, проблема в том, что контроль доступа туда работает только в админке MODX. Файлы загруженные в эту папку доступны по прямой ссылке любому пользователю (в том числе анонимному), либо я настроил не правильно.
Сделал временное решение, но мне оно не очень нравится. описываю решение:
в папку которая указана в basePath положил файл .htaccsess т.к. сервер на apache2 со строкой
Поэтому создал сниппет с кодом:
Вызвал сниппет [[!file_download?&filename=`[[!#GET.fn]]`]] передал ему get параметр содержащий имя файла. Сниппет вызван на странице которая принадлежит группе ресурсов на которую настроен доступ только для авторизованных.
Вроде работает, но уверен есть решение лучше. Оставлю это тут, если кто-то будет искать подобное решение, и надеюсь что более опытные пользователи посмотрят решение и предложат лучшую альтернативу.
Сделал временное решение, но мне оно не очень нравится. описываю решение:
в папку которая указана в 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 параметр содержащий имя файла. Сниппет вызван на странице которая принадлежит группе ресурсов на которую настроен доступ только для авторизованных.
Вроде работает, но уверен есть решение лучше. Оставлю это тут, если кто-то будет искать подобное решение, и надеюсь что более опытные пользователи посмотрят решение и предложат лучшую альтернативу.
Да, вы правы. Кроме как запрещать доступ через настройки вебсервера и отдавать файлы через readfile() с проверкой прав, на его просмотр — по другому и не решить данный вопрос.
Я буквально недавно решал подобную задачу, в рамках микрофреймворка slim и там было проще, в том плане, что сама архитектура фреймворка позволяет все файлы приложения хранить на уровень ниже, чем публичная директория, куда смотрит веб сервер, поэтому получить файл по прямой ссылке просто невозможно.
Я буквально недавно решал подобную задачу, в рамках микрофреймворка slim и там было проще, в том плане, что сама архитектура фреймворка позволяет все файлы приложения хранить на уровень ниже, чем публичная директория, куда смотрит веб сервер, поэтому получить файл по прямой ссылке просто невозможно.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.