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

Главные вкладки

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

Здравствуйте, подскажите пожалуйста, у меня такая вот задача стоит. Я написал модуль, который генерирует 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;
    }
}
?>

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

Комментарии

Аватар пользователя bumble bumble 16 февраля 2018 в 10:42

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

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

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

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

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

Верно ?

Аватар пользователя shlop shlop 16 февраля 2018 в 11:47

Тогда немного не понятно, а как калбек тогда выполниться если на страницу не переходить, вот допустим страница модуля где генерируется вот эти вот 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>";
?>
Аватар пользователя bumble bumble 16 февраля 2018 в 12:15

shlop wrote:

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

shlop wrote:

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

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

Аватар пользователя shlop shlop 16 февраля 2018 в 13:40
1

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

<?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. Спасибо большое за помощь.

Аватар пользователя bumble bumble 16 февраля 2018 в 13:45

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

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

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

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

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

Аватар пользователя bumble bumble 16 февраля 2018 в 14:20
1

Все верно.

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

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

Аватар пользователя ivnish ivnish 16 февраля 2018 в 10:43

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

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