Работа с приватными файлами в Drupal

21 марта 2014 - 17:58

Постановка задачи

По умолчанию в Друпал загружаемые файлы помещаются в папку 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():

<?php
/**
 * Implements hook_file_download().
 */

function MODULE_file_download($uri) {
    global $user;
    if (in_array('administrator', $user -> roles)) {
      return array('Content-Type' => file_get_mimetype($uri));
    } else {
      return -1;
    }
}

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