Пример интеграции прав доступа
Предположим, что у нас есть собственный модуль 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-2024, «1С-Битрикс», 2024
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.