Налаштування прав доступу до медіафайлів 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
- Налаштування логу звернень до захищених файлів







