Документация для разработчиков
Темная тема

Пример интеграции прав доступа

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

  1. Первым шагом определяем список доступных действий:
    <?php
    namespace Bitrix\Example\Access;
    
    class ActionDictionary
    {
      public const
        ACTION_CREATE = 'create',
        ACTION_EDIT = 'edit';
    }
    
  2. 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; // право редактировать все записи
    }
    
  3. И языковой файл к нему:
    <?php
    $MESS["EXAMPLE_CREATE"] = "Создание записей";
    $MESS["EXAMPLE_EDIT_OWN"] = "Редактирование своих записей";
    $MESS["EXAMPLE_EDIT_ALL"] = "Редактирование всех записей";
    
    // блок ниже не обязателен, но если какие-то строчки указаны, то будут выведены как подсказки в таблице настройки прав
    $MESS["HINT_EXAMPLE_EDIT_ALL"] = "Данное право позволит пользователю редактировать абсолютно все записи.";
    
  4. Создаем 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';
         }
      }
      
  5. Создаем контроллер:
    <?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);
       }
    }
    
  6. Переходим к созданию необходимых правил. В нашем примере определено два действия (две операции), значит необходимо два правила. В качестве примера реализуем правило для редактирования записи.
    <?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;
       }
    }
    
  7. Последний шаг. Расставим проверку в нужных местах кодах (как правило, в компонентах, обрабатывающих действия пользователей):
    if (!ExampleAccessController::can($userId, ActionDictionary::ACTION_CREATE))
    {
      // 403 error
    }
    

Для настройки прав необходимо создать компонент на базе BX.UI.AccessRights. Также можно посмотреть пример в tasks/install/components/bitrix/tasks.config.permissions.



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2021, «1С-Битрикс», 2021
Наверх