Пример интеграции прав доступа
Предположим, что у нас есть собственный модуль Example, для которого нам нужно интегрировать права доступа.
- Первым шагом определяем список доступных действий:
<?php namespace Bitrix\Example\Access; class ActionDictionary { public const ACTION_CREATE = 'create', ACTION_EDIT = 'edit'; }
- Cоздаем словарь разрешений:
<?php namespace Bitrix\Example\Access\Permission; class PermissionDictionary extends \Bitrix\Main\Access\Permission\PermissionDictionary { public const EXAMPLE_CREATE = 1, // право создавать записи EXAMPLE_EDIT_OWN = 2, // право редактировать свои записи EXAMPLE_EDIT_ALL = 3; // право редактировать все записи }
- И языковой файл к нему:
<?php $MESS["EXAMPLE_CREATE"] = "Создание записей"; $MESS["EXAMPLE_EDIT_OWN"] = "Редактирование своих записей"; $MESS["EXAMPLE_EDIT_ALL"] = "Редактирование всех записей"; // блок ниже не обязателен, но если какие-то строчки указаны, то будут выведены как подсказки в таблице настройки прав $MESS["HINT_EXAMPLE_EDIT_ALL"] = "Данное право позволит пользователю редактировать абсолютно все записи.";
- Создаем ORM классы:
<?php namespace Bitrix\Example\Access\Permission; use Bitrix\Main\Access\Permission\AccessPermissionTable; class ExamplePermissionTable extends AccessPermissionTable { public static function getTableName() { return 'b_example_permission'; } }
<?php namespace Bitrix\Example\Access\Role; use Bitrix\Main\Access\Role\AccessRoleTable; class ExampleRoleTable extends AccessRoleTable { public static function getTableName() { return 'b_example_role'; } }
<?php namespace Bitrix\Example\Access\Role; use Bitrix\Main\Access\Role\AccessRoleRelationTable; class ExampleRoleRelationTable extends AccessRoleRelationTable { public static function getTableName() { return 'b_example_role_relation'; } }
- Создаем контроллер:
<?php namespace Bitrix\Example\Access; use Bitrix\Main\Access\User\AccessibleUser; use Bitrix\Main\Access\BaseAccessController; use Bitrix\Main\Access\Model\UserModel; use Bitrix\Main\Access\AccessibleItem; class ExampleAccessController extends BaseAccessController { protected function loadItem(int $itemId = null): AccessibleItem { return ExampleModel::createFromId($itemId); // создание модели записи оставим за кадром, у всех свое } protected function loadUser(int $userId): AccessibleUser { return UserModel::createFromId($userId); } }
- Переходим к созданию необходимых правил. В нашем примере определено два действия (две операции), значит необходимо два правила. В качестве примера реализуем правило для редактирования записи.
<?php namespace Bitrix\Example\Access\Rule; use Bitrix\Main\Access\AccessibleItem; use Bitrix\Example\Access\Permission\PermissionDictionary; class ExampleEditRule extends \Bitrix\Main\Access\Rule\AbstractRule { public function execute(AccessibleItem $item = null, $params = null): bool { // админ может все if ($this->user->isAdmin()) { return true; } // пользователи с правом редактировать все записи if ($this->user->getPermission(PermissionDictionary::EXAMPLE_EDIT_ALL)) { return true; } // пользователи с правом редактировать свои записи if ( $item->getOwnerId() === $this->user->getUserId() && $this->user->getPermission(PermissionDictionary::EXAMPLE_EDIT_OWN) ) { return true; } return false; } }
- Последний шаг. Расставим проверку в нужных местах кодах (как правило, в компонентах, обрабатывающих действия пользователей):
if (!ExampleAccessController::can($userId, ActionDictionary::ACTION_CREATE)) { // 403 error }
Для настройки прав необходимо создать компонент на базе BX.UI.AccessRights. Также можно посмотреть пример в tasks/install/components/bitrix/tasks.config.permissions
.
© «Битрикс», 2001-2025, «1С-Битрикс», 2025