Как ограничить доступ на скачивания файлов ?
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;
}
}
?>
но тут проблема в том, что теперь вообще никто не может скачать файл.
Подскажите пожалуйста, как можно сделать так, что бы файлы могли скачать только пользователи определенной роли, заранее благодарю за ответ.
- Блог
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
Все же, правильно хранить в приватной директории, если не нужно всем доступ давать.
А организовать скачивание необходимо следующим образом:
Извините, то есть если я правильно понял, нужно сделать:
Верно ?
Ну, кроме "переходим на страницу", вроде все верно.
Тогда немного не понятно, а как калбек тогда выполниться если на страницу не переходить, вот допустим страница модуля где генерируется вот эти вот 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>";
?>
Вы же пользователю ссылку на файл даете, при чем тут форма?
Там просто фильтр по дате, и таблица на странице
А всё, кажется я понял. Получается,
создаю страницу с аргументом -
<?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. Спасибо большое за помощь.
Да, направление верное, рад что помог.
В качестве замечания, все же рекомендую организовать хранение файлов если не собственным обработчиком (Create/Delete), то родным друпаловским. Привязка к файлу по имени выглядит не очень стабильно.
Извините но не совсем понял вот эту часть, все же рекомендую организовать хранение файлов если не собственным обработчиком (Create/Delete), то родным друпаловским
Ну я просто вот думаю, у меня же папка сейчас Privates, и эта папка у меня в "Путь к личным файлам", то есть папка закрыта, сейчас вот только проверки сделаю, что бы определенные роли скачивали из неё файлы и всё. Тут просто функционал такой что, пользователь выбирает строки из таблицы, жмет кнопку сформировать файл, и файл создается в этой папке. А потом при следующих действиях уже в другом модули, после небольшой работы, этот файл удаляется.
Ну а про привязку к имени файла понял, то есть записывать в базу данных ID файла, и в аргументе тогда уже не имя файла передавать а ID.
Все верно.
Просто, по имени файла вы не можете быть уверенным хотя бы в том, что не будет создан еще один файл и таким же названием. Да и менеджить файлы удобнее по ID'шникам.
Вот здесь неплохо описан процесс использования ядренной системы управления файлами:
Понял, спасибо
excel_access_view лучше поместить как раз в 'access callback'
В таких случаях можно генерировать путь с длинным хэшем.
Например /sites/default/files/excelfille/dhj43892v3b4rf743ghdfeb374yr34uhrf_report.xls
Ещё подсматривал сюда https://drupal.ru/node/104625 поднимался примерно такой же вопрос