Постановка задачи
По умолчанию в Друпал загружаемые файлы помещаются в папку sites/default/files и доступны для скачивания. Однако иногда возникает задача защитить некоторые файлы от скачивания или предоставить доступ к этим файлам для пользователей определенных ролей. Решению этой задачи и посвящена данная статья.
Указываем путь приватной файловой системы
Первым делом необходимо создать защищенную директорию, в которой будут храниться файлы, доступ к которым требуется ограничить. Для этого в разделе админки «Конфигурация – Файловая система» (admin/config/media/file-system) в поле «Приватный путь файловой системы» введем, например, адрес sites/default/files/private. После сохранения настроек Друпал создаст папку private в директории sites/default/files и защитит ее файлом .htaccess.
Теперь мы можем поместить какой-нибудь файл в папку sites/default/files/private. Введя путь к файлу в адресную строку браузера, мы получим ответ сервера «Доступ запрещен». Правда, как справедливо отмечается здесь, мы можем и не защитить таким образом файл от скачивания без дополнительных настроек веб-сервера. Поэтому правильнее помещать защищенную папку вне корневой директории сайта. Для этого в поле «Приватный путь файловой системы» вводим не sites/default/files/private , а ../private.
Итак, первая часть задачи решена – мы создали защищенную директорию, чтобы не допустить скачивания хранящихся в ней файлов по прямым ссылкам. Теперь нужно предоставить доступ к этому файлу только для пользователей определенной роли, например, администраторов сайта.
Используем hook_file_download() для управления доступом к приватным файлам
Пусть в одном из типов материалов сайта имеется поле «Файл», при этом загружаемые через это поле файлы должны быть доступны только администраторам сайта.
Для этого сначала в настройках данного поля в опции «Хранилище» указываем «Приватные файлы».
Далее создаем модуль, в котором имплементируем хук hook_file_download():
Теперь все файлы на нашем Drupal-сайте, для загрузки которых выбран защищенный метод, будут доступны только администраторам сайта.