Как ограничить доступ на скачивания файлов ?

16 февраля 2018 в 10:12
Аватар пользователя shlop shlop 0 14

Здравствуйте, подскажите пожалуйста, у меня такая вот задача стоит. Я написал модуль, который генерирует Excel файлы, кладутся они в папку на сервере, и пользователю который создал этот файл, даётся ссылка на скачивание.

<?php
return "<h3><a href='sites/default/files/excelfille/".$name_file."'"."download>Скачать файл</a></h3>";
?>

Но тут проблема в том, что любой пользователь может скачать файл из этой папки, допустим угадав имя файла. Пробовал в файловой системе, в поле "Путь к личным файлам", сделать папку private а в ней уже папку excelfille, ну и к этому же добавил такой вот hook в модуль,

<?php
function user_redir_file_download($uri) {
    global 
$user;
    if (
in_array('administrator'$user -> roles) || in_array('Администратор'$user -> roles)) {
      return array(
'Content-Type' => file_get_mimetype($uri));
    } else {
      return -
1;
    }
}
?>

но тут проблема в том, что теперь вообще никто не может скачать файл.
Подскажите пожалуйста, как можно сделать так, что бы файлы могли скачать только пользователи определенной роли, заранее благодарю за ответ.

Комментарии

Все же, правильно хранить в приватной директории, если не нужно всем доступ давать.

А организовать скачивание необходимо следующим образом:

  • Добавить роут (hook_menu), с приемом ID скачиваемого файла
  • Сам ID'шник должен быть присвоен каждому документу и записан в БД при генерации
  • В коллбеке страницы проверять нужные условия (роль, в данном случае) и отдавать файл / генерировать 403
16 февраля 2018 в 10:42

Извините, то есть если я правильно понял, нужно сделать:

  • Страницу с помощью hook_menu
  • По нажатию на ссылку "скачать файл" переходим на страницу созданную в hook_menu
  • И в коллбеке страницы проверяем роль, если роль подходит то возвращаем файл, а если нет, то нет

Верно ?

16 февраля 2018 в 11:27

Тогда немного не понятно, а как калбек тогда выполниться если на страницу не переходить, вот допустим страница модуля где генерируется вот эти вот Excel файлы. Я же когда переходу на эту страницу происходит return $form в sendfca_tables_page,

<?php
function sendfca_menu() {
  
$items['send_fca'] = array(
      
'title' => t('Отправить данные в ФСА'),
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('sendfca_tables_page'),
    
'access callback' => 'module_access3'
  
);
  return 
$items;
}
?>

А там потом после генерации и всего остального, получаю вот такую вот ссылку.

<?php
return "<h3><a href='Privates/".$name_file."'"."download>Скачать файл</a></h3>";
?>
16 февраля 2018 в 11:47

shlop wrote:

Тогда немного не понятно, а как калбек тогда выполниться если на страницу не переходить

shlop wrote:

пользователю который создал этот файл, даётся ссылка на скачивание.

Вы же пользователю ссылку на файл даете, при чем тут форма?

16 февраля 2018 в 12:15

А всё, кажется я понял. Получается,
создаю страницу с аргументом -

<?php
  $items
['pageExcel/%'] = array(
    
'page callback' => 'excel_access_view',
    
'access callback' => TRUE,
    
'page arguments' => array(1),
    
'type' => MENU_CALLBACK,
  );
?>

Ссылка на скачивание получается такая -

<?php
return "<h3><a href='pageExcel/".$name_file."'".">Скачать файл</a></h3>";
?>

Теперь в excel_access_view делаю проверку, если всё хорошо то отдаю файл если не то генерирую 403. Спасибо большое за помощь.

16 февраля 2018 в 13:40

Да, направление верное, рад что помог.

В качестве замечания, все же рекомендую организовать хранение файлов если не собственным обработчиком (Create/Delete), то родным друпаловским. Привязка к файлу по имени выглядит не очень стабильно.

16 февраля 2018 в 13:45

Извините но не совсем понял вот эту часть, все же рекомендую организовать хранение файлов если не собственным обработчиком (Create/Delete), то родным друпаловским

Ну я просто вот думаю, у меня же папка сейчас Privates, и эта папка у меня в "Путь к личным файлам", то есть папка закрыта, сейчас вот только проверки сделаю, что бы определенные роли скачивали из неё файлы и всё. Тут просто функционал такой что, пользователь выбирает строки из таблицы, жмет кнопку сформировать файл, и файл создается в этой папке. А потом при следующих действиях уже в другом модули, после небольшой работы, этот файл удаляется.
Ну а про привязку к имени файла понял, то есть записывать в базу данных ID файла, и в аргументе тогда уже не имя файла передавать а ID.

16 февраля 2018 в 14:14

Все верно.

Просто, по имени файла вы не можете быть уверенным хотя бы в том, что не будет создан еще один файл и таким же названием. Да и менеджить файлы удобнее по ID'шникам.

Вот здесь неплохо описан процесс использования ядренной системы управления файлами:

16 февраля 2018 в 14:20

В таких случаях можно генерировать путь с длинным хэшем.

Например /sites/default/files/excelfille/dhj43892v3b4rf743ghdfeb374yr34uhrf_report.xls

16 февраля 2018 в 10:43