Права доступа

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

Основные принципы работы прав доступа

  1. Права на объекты. Права можно настроить для страниц, файлов, информационных блоков и модулей.

  2. Наследование прав. Дочерние элементы наследуют права доступа от родительского раздела. Это позволяет не задавать права для каждого подраздела вручную. При необходимости для любого подраздела или элемента можно настроить индивидуальные права.

  3. Максимальные права. Права пользователя складываются из максимальных прав всех групп, в которых он состоит. Например, если пользователь состоит в двух группах с правами Чтение и Запись, он получит право Запись.

Группа Администраторы имеет идентификатор 1. ID группы и ID пользователя — разные значения. Для программной проверки статуса администратора используйте $USER->IsAdmin(), а не сравнение ID пользователя с 1.

Группы пользователей

Каждый пользователь входит в одну из групп. Если посетитель не авторизован, он автоматически попадает в группу Неавторизованные пользователи. У этой группы минимальные права: они могут просматривать данные, разрешенные администратором.

После регистрации пользователь становится частью базовой группы, указанной в настройках Главного модуля. Например, в 1С-Битрикс: управление сайтом по умолчанию это группа Зарегистрированные пользователи.

Администратор может добавлять зарегистрированных пользователей в другие группы с разными правами.

Права по умолчанию

В Bitrix Framework есть стандартные группы пользователей с предустановленными правами.

  • Администраторы

  • Все пользователи (в том числе неавторизованные)

  • Пользователи, имеющие право голосовать за рейтинг

  • Пользователи имеющие право голосовать за авторитет

В зависимости от установленного решения, набор стандартных групп может быть больше.

Администраторы имеют полный доступ ко всем модулям и функциям.

Как ограничить доступ к публичной части сайта

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

  1. Откройте страницу Настройки > Настройки продукта > Настройки модулей > Главный модуль.

  2. Включите опцию Закрыть сайт для посетителей.

  3. Укажите сообщение для пользователей, которые откроют сайт.

Настройки интерфейса для групп

В Bitrix Framework можно настроить отображение разных шаблонов для разных групп пользователей.

  • Перейдите в Настройки > Настройки продукта > Сайты > Список сайтов.

  • Выберите сайт и настройте шаблон для каждой группы пользователей.

Уровни доступа

Уровень доступа определяет, какие операции доступны пользователю, например:

  • Чтение — просмотр информации.

  • Запись — редактирование и добавление данных.

  • Полный доступ — полный контроль над объектом, включая управление правами.

Уровни доступа наследуются: если для текущего раздела или страницы права не заданы, используются права родительского раздела.

Управление уровнями доступа

Управлять уровнями доступа можно в административном разделе на странице Настройки > Пользователи > Уровни доступа.

  • Пользовательские уровни доступа можно редактировать или создавать новые.

  • Системные уровни доступа нельзя отредактировать, только посмотреть.

Создание нового уровня доступа

  1. Нажмите Добавить уровень доступа.

  2. Заполните параметры формы.

    • Название — напишите наименование уровня.

    • Модуль — выберите модуль, для которого создается уровень.

    • Привязка — выберите функционал модуля.

    • Буква — укажите краткое обозначение уровня доступа.

    • Описание — добавьте описание, если необходимо.

  3. На вкладке Включаемые операции выберите разрешенные действия.

Права доступа к инфоблокам

Права доступа для информационных блоков работают аналогично правам статических страниц и разделов. Они наследуются по иерархии: от инфоблока к разделу и элементу. Если пользователь имеет права Полный доступ на инфоблок, он может управлять доступом к его элементам.

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

Права доступа к инфоблокам настраиваются в форме редактирования инфоблока на вкладке Доступ. Есть два режима:

  1. Простой режим — права задаются для всего инфоблока.

  2. Расширенный режим — права можно задавать для отдельных разделов и элементов.

Роли в модуле CRM

В модуле CRM действует ролевая система прав. Настройки доступа к каталогу товаров в CRM выполняются для ролей.

Настроить права для инфоблока

  1. Перейдите в Контент > Инфоблоки > Типы инфоблоков > [название_типа] > [название_инфоблока].

  2. На вкладке Доступ выберите группы и установите права.

Настроить права для разделов и элементов

  1. Включите опцию Расширенное управление правами в настройках инфоблока.

  2. Откройте форму редактирования элемента или раздел.

  3. Установите права на вкладке Доступ.

Пример наследования прав

Допустим, нужно запретить доступ к разделу Аксессуары в каталоге Одежда. Если права для разделов каталога не изменялись, они унаследуют права инфоблока Каталоги.

Чтобы запретить доступ:

  1. Перейдите в административный раздел Контент > Каталоги > Одежда.

  2. Выберите раздел Аксессуары и нажмите Изменить.

  3. Во вкладке Доступ добавьте новое правило для группы Все посетители и установите Нет доступа.

После сохранения раздел Аксессуары будет скрыт для всех посетителей.

Права доступа к файлам и папкам

Права на файлы и папки настраиваются через Менеджер файлов.

  1. В административном разделе откройте Контент > Структура сайта > Файлы и папки.

  2. Выберите файл или папку и нажмите Права на доступ.

  3. Установите права для групп пользователей.

Файл .access.php

Система проверяет права доступа из .access.php в прологе, до выполнения кода страницы. Файл используют, например, для ограничения доступа к служебным папкам. Права на объекты, которые обрабатывает код страницы, проверяйте отдельно.

Файл содержит PHP-массив формата:

$PERM['файл_или_папка']['ID_группы'] = 'уровень_доступа';
  • файл или папка — имя файла или папки, для которых назначаются права доступа.

  • ID группы пользователей — идентификатор группы, а не отдельного пользователя. Например, ключ '1' обозначает группу Администраторы. Символ * задает право по умолчанию для групп без отдельного правила.

  • Уровень доступа — поддерживаются значения:

    • D Deny — запрет,

    • R Read — чтение,

    • U Workflow — редактирование через документооборот,

    • W Write — полное редактирование,

    • X Full — все права + управление доступом.

Пример настройки прав через файл

Добавьте правила в файл /.access.php в корне сайта. Ключ '/' задает права на корень сайта и не применяется к текущему каталогу, если файл .access.php находится во вложенной папке:

<?php

// Права на файл /index.php
$PERM['index.php']['2'] = 'R'; // Группа с ID 2 — чтение
$PERM['index.php']['3'] = 'D'; // Группа с ID 3 — запрет доступа

// Права на папку /admin
$PERM['admin']['*'] = 'D'; // Право по умолчанию — запрет доступа
$PERM['admin']['1'] = 'R'; // Группа «Администраторы» с ID 1 — чтение

// Права на корень сайта
$PERM['/']['*'] = 'R'; // Право по умолчанию — чтение
$PERM['/']['1'] = 'W'; // Группа «Администраторы» с ID 1 — запись

Записи для группы с ID 1 показывают формат назначения прав группе. Они не ограничивают полномочия администратора, для проверки которых система использует особый порядок.

Проблемы с правами на файлы и их решение

Не удается сохранить изменения через FTP

Решение: убедиться, что пользователь веб-сервера имеет права на запись в файлы. Использовать команду chmod для изменения прав.

chmod -R 775 /path/to/dir

Файлы загружаются через FTP, но не редактируются в продукте.

Решение: проверить права доступа для пользователя веб-сервера. Убедиться, что файлы принадлежат правильному пользователю.

Права доступа к публичным страницам

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

При редактировании страницы или раздела можно настроить права более детально. Например, ограничить доступ для отдельных пользователей.

  1. Откройте страницу или раздел для редактирования.

  2. Задайте нужные права для групп.

  3. Чтобы добавить новое правило, нажмите Добавить право доступа.

  4. Выберите пользователя или группу и задайте уровень прав.

Права доступа к модулям

Bitrix Framework поддерживает два уровня разграничения прав доступа:

  1. Доступ на файлы и каталоги.

  2. Права в рамках логики модуля.

Для статичных публичных страниц применяется только первый уровень доступа на файлы и каталоги. Если файл является частью модуля, система проверяет второй уровень прав из настроек модуля.

Как настроить права

Права доступа к модулям можно настроить двумя способами.

  1. Через настройки группы пользователей.

    • Перейдите в Настройки > Пользователи > Группы пользователей.

    • Выберите группу.

    • Настройте права для каждого модуля на вкладке Доступ.

  2. Через настройки модуля.

    • Перейдите в Настройки > Настройки продукта > Настройки модулей.

    • Выберите модуль.

    • Настройте права для групп на вкладке Доступ.

Разграничение прав в логике модулей

  1. Права. Если пользователь обладает несколькими правами, выбираются максимальные.

  2. Роли. Если пользователь обладает несколькими ролями, он получает максимальные возможности этих ролей.

Модули, которые поддерживают роли, можно найти в административном разделе на странице Настройки > Пользователи > Уровни доступа . В остальных модулях и настройках системы используются права.

Проверить права в своем коде

В компоненте или контроллере проверяйте право на конкретное действие с конкретным объектом до возврата данных или их изменения. Ограничение доступа к странице и скрытая кнопка в интерфейсе не защищают отдельный AJAX-запрос.

Подмена ID объекта в запросе может привести к IDOR — доступу к чужим данным без разрешения. Например, пользователь меняет ID задачи в адресе запроса и получает задачу, которую ему не разрешено читать. Приведение ID к числу проверяет формат значения, но не право доступа.

Выбрать способ проверки

Используйте проверку, которая соответствует уровню доступа и объекту.

  • Метод $USER->IsAdmin() проверяет статус администратора текущего пользователя. Подходит для действий, доступных только администраторам.
  • Метод CMain::GetUserRight($moduleId) возвращает буквенный уровень доступа текущего пользователя к модулю. В $moduleId передайте идентификатор модуля. Значения и требуемый уровень определяйте по правилам этого модуля.
  • Метод CIBlock::GetPermission($iblockId) возвращает буквенный уровень доступа текущего пользователя к инфоблоку в простом режиме прав. В $iblockId передайте ID инфоблока. При расширенных правах используйте проверку операций над конкретным элементом или разделом.
  • Класс Bitrix\Main\Engine\CurrentUser предоставляет данные текущего пользователя в контроллере. Метод getId() возвращает ID пользователя, а isAdmin() проверяет статус администратора. Получение пользователя само по себе не проверяет доступ к объекту.
  • Контроллер доступа модуля проверяет действие над объектом по правилам этого модуля. Например, Bitrix\Tasks\Access\TaskAccessController проверяет права на задачи. Выбирайте конкретную реализацию AccessController для нужного типа объектов.

Для действия, доступного только администраторам, добавьте проверку после подключения пролога:

global $USER;

if (!$USER->IsAdmin())
{
    ShowError('Доступ запрещен');

    return;
}

Для проверки чтения инфоблока в простом режиме сначала подключите модуль iblock через Loader::includeModule(). Подставьте ID инфоблока из настроек проекта:

use Bitrix\Main\Loader;

$iblockId = 5;

if (!Loader::includeModule('iblock') || CIBlock::GetPermission($iblockId) < 'R')
{
    ShowError('Доступ запрещен');

    return;
}

Проверить чтение элемента в компоненте

В component.php ограничьте выборку нужным инфоблоком и включите проверку прав в CIBlockElement::GetList(). Параметр CHECK_PERMISSIONS со значением 'Y' включает проверку, а MIN_PERMISSION со значением 'R' задает минимальное право чтения. Проверка учитывает простой или расширенный режим прав инфоблока.

В примере ID инфоблока берется из настроек компонента IBLOCK_ID, а ID элемента — из параметра запроса elementId. Параметр IBLOCK_ID задайте на сервере. Разместите код до кеширования результата и подключения шаблона:

use Bitrix\Main\Context;
use Bitrix\Main\Loader;

if (!Loader::includeModule('iblock'))
{
    ShowError('Модуль инфоблоков недоступен');

    return;
}

$iblockId = (int)($arParams['IBLOCK_ID'] ?? 0);
$elementId = (int)Context::getCurrent()->getRequest()->get('elementId');

if ($iblockId <= 0 || $elementId <= 0)
{
    ShowError('Элемент не найден или доступ запрещен');

    return;
}

$result = CIBlockElement::GetList(
    [],
    [
        'IBLOCK_ID' => $iblockId,
        'ID' => $elementId,
        'ACTIVE' => 'Y',
        'CHECK_PERMISSIONS' => 'Y',
        'MIN_PERMISSION' => 'R',
    ],
    false,
    ['nTopCount' => 1],
    ['ID', 'IBLOCK_ID', 'NAME']
);
$element = $result->Fetch();

if (!$element)
{
    ShowError('Элемент не найден или доступ запрещен');

    return;
}

$arResult['ELEMENT'] = $element;
$this->IncludeComponentTemplate();

Отсутствующий и недоступный элемент дают одинаковое сообщение. При подмене elementId выборка вернет данные только при наличии права чтения. Если добавите кеширование, учитывайте права пользователя в ключе кеша, чтобы результат одного пользователя не получил другой.

Проверить доступ к объекту в контроллере

В контроллере получите ID пользователя через CurrentUser и передайте его в контроллер доступа вместе с действием и ID объекта. ID проверяемого пользователя берите из текущей сессии.

Пример предназначен для Битрикс24 с модулем tasks. Метод TaskAccessController::can() проверяет чтение задачи по ее ID. Константа ActionDictionary::ACTION_TASK_READ обозначает действие чтения. Фильтры авторизации и CSRF базового контроллера сохраняются, но право на задачу проверяется отдельно.

Добавьте действие в контроллер своего модуля. В примере используется пространство имен My\Content\Controller, которое нужно заменить на пространство имен своего модуля:

namespace My\Content\Controller;

use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Tasks\Access\ActionDictionary;
use Bitrix\Tasks\Access\TaskAccessController;
use Bitrix\Tasks\Internals\TaskTable;

final class Task extends Controller
{
    public function readAction(int $taskId, CurrentUser $user): ?array
    {
        $userId = (int)$user->getId();

        if ($userId <= 0 || $taskId <= 0 || !Loader::includeModule('tasks'))
        {
            $this->addError(new Error('Задача не найдена или доступ запрещен'));

            return null;
        }

        if (!TaskAccessController::can($userId, ActionDictionary::ACTION_TASK_READ, $taskId))
        {
            $this->addError(new Error('Задача не найдена или доступ запрещен'));

            return null;
        }

        $task =
            TaskTable::getList([
                'select' => ['ID', 'TITLE'],
                'filter' => ['=ID' => $taskId],
                'limit' => 1,
            ])
                ->fetch()
        ;

        if (!$task)
        {
            $this->addError(new Error('Задача не найдена или доступ запрещен'));

            return null;
        }

        return $task;
    }
}

При подмене taskId контроллер повторно проверит право текущего пользователя на чтение указанной задачи. Для изменения или удаления объекта используйте соответствующее действие контроллера доступа. Право чтения не дает разрешения на запись.

Следующая