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

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

Предположим, что у нас есть собственный модуль 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-2024, «1С-Битрикс», 2024