Настройка прав доступа к медиафайлам 1С-Битрикс
Медиабиблиотека Битрикс поддерживает права доступа на уровне коллекций (папок), но не на уровне отдельных файлов. Это значит: либо пользователь видит всю коллекцию, либо не видит ничего. Для более тонкого разграничения — например, «редактор контента видит только свои загрузки, а не файлы других отделов» — нужна дополнительная настройка.
Встроенная система прав медиабиблиотеки
Права на коллекции хранятся в таблице b_medialib_coll_right. Структура: COLLECTION_ID, GROUP_ID, PERMISSION. Уровни прав:
-
R— чтение (просмотр файлов) -
W— запись (добавление файлов в коллекцию) -
X— управление (редактирование, удаление)
Права задаются через интерфейс: Контент → Медиабиблиотека → [правая кнопка на коллекции] → Права доступа. Или программно:
CMedialib::SetCollectionRights($collectionId, [
['GROUP_ID' => $groupId, 'PERMISSION' => 'W'],
]);
Ограничение доступа к физическим файлам
Проблема в том, что файлы в /upload/ доступны напрямую по URL без авторизации — веб-сервер отдаёт их статически, минуя PHP. Чтобы ограничить доступ к файлам, нужно:
- Перенести закрытые файлы в директорию вне
DocumentRootили в/upload/protected/ - Настроить веб-сервер так, чтобы обращения к защищённым файлам проходили через PHP-обработчик
Для Nginx добавляется location:
location ~* ^/upload/protected/ {
internal;
alias /var/www/upload/protected/;
}
PHP-скрипт проверяет права пользователя и отдаёт файл через X-Accel-Redirect:
if (!$USER->IsAuthorized() || !checkFileAccess($fileId)) {
header('HTTP/1.0 403 Forbidden');
exit;
}
header('X-Accel-Redirect: /upload/protected/' . $filePath);
header('Content-Type: ' . $mimeType);
Права на уровне файла
Для прав на конкретные файлы (не коллекции) создаётся отдельная таблица:
CREATE TABLE bl_medialib_file_rights (
file_id INT NOT NULL,
group_id INT NOT NULL,
permission CHAR(1) NOT NULL DEFAULT 'R',
PRIMARY KEY (file_id, group_id)
);
При обращении к защищённому файлу PHP проверяет членство пользователя в группах ($USER->IsInGroup($groupId)) и наличие записи с нужным уровнем прав.
Разграничение для разных отделов
Типовая схема для крупного магазина с несколькими отделами контента:
| Коллекция | Группа | Права |
|---|---|---|
| /Каталог/Электроника | Менеджеры электроники | W (чтение + запись) |
| /Каталог/Одежда | Менеджеры одежды | W |
| /Маркетинг/Баннеры | Маркетологи | X (полный) |
| /Архив | Все контент-менеджеры | R (только чтение) |
Группы создаются через CGroup::Add(), пользователи добавляются через CUser::Update() с полем GROUP_ID.
Аудит доступа
Для отслеживания, кто и когда обращался к защищённым файлам, создаётся лог в таблице bl_file_access_log с полями file_id, user_id, accessed_at, ip, result (allowed/denied). Лог пишется в PHP-обработчике файловых запросов.
Что входит в настройку
- Аудит текущей структуры коллекций и существующих прав
- Настройка прав на коллекции по группам пользователей
- Конфигурация веб-сервера для защиты файлов в
/upload/ - При необходимости — реализация прав на уровне отдельных файлов
- PHP-обработчик для проверки прав и отдачи файлов через X-Accel-Redirect
- Настройка лога обращений к защищённым файлам







