UserPermissions
Права доступа
Права доступа — важный раздел бизнес-логики любого приложения. Публичное API сервиса разработано для решения типовых задач.
Настройки прав доступа
Права доступа в CRM настраиваются на уровне ролей. Роль можно назначить: пользователю, группе, подразделению.
На каждую роль настраиваются конкретные права доступа в разрезе «сущности».
Уровень прав настраивается для каждого права доступа. Уровень прав может быть простым — есть доступ или нет доступа, и более сложным — доступ в зависимости от принадлежности к отделу, в зависимости от текущей роли и так далее.
Права, относящиеся к сущностям CRM, настраиваются в разделе /crm/perms/all/
. API прав также поддерживает внешние, с точки зрения интерфейса, сущности:
- цифровые рабочие места
- crm формы
- виджеты на сайт
У этих сущностей есть свои интерфейсы прав и изолированные роли, однако с точки зрения принципов работы и способа хранения все это работает одинаково, и обслуживается сервисом \Bitrix\Crm\Service\UserPermissions
.
Сервис \Bitrix\Crm\Service\UserPermissions
Сервис доступен через контейнер сервисов:
$userPermissions = \Bitrix\Crm\Service\Container::getInstance()->getUserPermissions();
По умолчанию сервис работает с правами текущего пользователя. Для использования сервиса в контексте другого пользователя, ID пользователя нужно явно передать в конструктор:
$userPermissions = \Bitrix\Crm\Service\Container::getInstance()->getUserPermissions($userId);
UserPermissions содержит две группы методов: базовые проверки и проверки прав доступа.
Базовые проверки
Метод | Описание |
---|---|
$userPermissions->isAdmin(): bool |
Является ли пользователь администратором портала |
$userPermissions->isCrmAdmin(): bool |
Является ли пользователь администратором CRM. Пользователь считается администратором CRM, если его роли выдан доступ «Разрешить изменять настройки» |
$userPermissions->isAdminForEntity(int $entityTypeId): bool
|
Является ли пользователь администратором сущности $entityTypeId . Под администрированием подразумевается возможность настройки стадий, полей, отображения карточек и так далее. Этот доступ предоставляется администраторам CRM для сущностей, относящихся к CRM, и администраторам рабочих мест для смарт-процессов в рабочих местах
|
Проверки прав доступа к сущностям CRM
Каждую группу прав обслуживает отдельный класс. Класс UserPermissions не содержит методов для проверки прав доступа, он отдает зависимые от сущности объекты. Проверкой прав занимаются эти объекты.
Например, для проверки прав доступа к конкретным элементам используется объект \Bitrix\Crm\Service\UserPermissions\EntityPermissions\Item
. Получить его можно так:
\Bitrix\Crm\Service\Container::getInstance()->getUserPermissions()->item()
Далее использовать его методы, для проверки конкретных прав, например доступа на чтение:
\Bitrix\Crm\Service\Container::getInstance()->getUserPermissions()->item()->canRead(CCrmOwnerType::Lead, 1234);
Доступные объекты
Содержит методы проверки доступа на чтение, изменение, удаление, добавление конкретных элементов CRM.
Содержит несколько вариантов проверки для удобства использования. Например, для проверки доступа на чтение:
Типовой вариант проверки:
\Bitrix\Crm\Service\Container::getInstance()->getUserPermissions()->item()->canRead(CCrmOwnerType::Lead, 1234);
Проверка по \Bitrix\Crm\Item:
$item = \Bitrix\Crm\Service\Container::getInstance()->getFactory(CCrmOwnerType::Contact)->getItem(345); \Bitrix\Crm\Service\Container::getInstance()->getUserPermissions()->item()->canReadItem($item);
Такой вариант удобно использовать в точках, где уже есть объект $item
. Корректно работает в том числе для $item
не имеющих id, то есть пока еще не сохраненных в базе данных.
Метод | Описание |
---|---|
item()->canRead(int $entityTypeId, int $entityId): bool |
Может ли пользователь просматривать элемент $entityId сущности $entityTypeId |
item()->canReadItem(\Bitrix\Crm\Item $item): bool |
Может ли пользователь просматривать элемент $item . Такой вариант удобно использовать в точках, где уже есть объект $item |
item()->canAddItem(\Bitrix\Crm\Item $item): bool |
Может ли пользователь создать и сохранить в базу данных элемент $item |
item()->canUpdate(int $entityTypeId, int $entityId): bool |
Может ли пользователь изменять элемент $entityId сущности $entityTypeId |
item()->canUpdateItem(\Bitrix\Crm\Item $item): bool |
Может ли пользователь изменять элемент $item . Такой вариант удобно использовать в точках, где уже есть объект $item |
item()->canDelete(int $entityTypeId, int $entityId): bool |
Может ли пользователь удалить элемент $entityId сущности $entityTypeId |
item()->canDeleteItem(\Bitrix\Crm\Item $item): bool |
Может ли пользователь удалить элемент $item . Такой вариант удобно использовать в точках, где уже есть объект $item |
item()->canImportItem(\Bitrix\Crm\Item $item): bool |
Может ли пользователь сохранить в базу данных в процессе импорта элемент $item |
item()->canChangeStage(ItemIdentifier $itemIdentifier, string $fromStageId, string $toStageId): bool |
Может ли пользователь менять стадию элемента $itemIdentifier со стадии $fromStageId на стадию $toStageId |
Содержит методы проверки доступа на чтение, изменение, удаление, добавление определенного типа сущности CRM, например сделок.
Примеры:
Проверка, что у пользователя есть доступ на чтение хотя бы каких-то сделок:
\Bitrix\Crm\Service\Container::getInstance()->getUserPermissions()->entityType()->canReadItems(CCrmOwnerType::Deal);
Проверка, что у пользователя есть доступ на чтение хотя бы каких-то сделок в определенной воронке :
\Bitrix\Crm\Service\Container::getInstance()->getUserPermissions()->entityType()->canReadItemsInCategory(CCrmOwnerType::Deal, 1);
Для прав на чтение доступен также специфический метод, проверяющий, что у пользователя есть хоть какой-либо доступ к CRM или рабочему месту:
\Bitrix\Crm\Service\Container::getInstance()->getUserPermissions()->entityType()->canReadSomeItems();
Метод | Описание |
---|---|
entityType()->canReadItems(int $entityTypeId): bool |
Может ли пользователь просматривать элементы сущности $entityTypeId . Вернет true , если у пользователя есть права на чтение элементов этой сущности. Если сущность поддерживает воронки, метод вернет true , если у пользователя есть права на чтение элементов хотя бы в одной воронке |
entityType()->canReadItemsInCategory(int $entityTypeId, int $categoryId): bool |
Может ли пользователь просматривать элементы сущности $entityTypeId в воронке $categoryId . Вернет true , если у пользователя есть права на чтение элементов в этой воронке этой сущности |
entityType()->canReadSomeItemsInCrm(): bool |
Может ли пользователь просматривать хотя бы какие-то элементы каких-то сущностей CRM. Вернет true , если у пользователя есть права на чтение элементов хотя бы одной из сущностей CRM. Можно считать эту проверку ответом на вопрос, есть ли у пользователя доступ в CRM |
entityType()->canAddItems(int $entityTypeId): bool |
Может ли пользователь создать и сохранить в базу данных элементы сущности $entityTypeId . Вернет true , если у пользователя есть права на добавление элементов этой сущности. Если сущность поддерживает воронки, метод вернет true , если у пользователя есть права на добавление элементов хотя бы в одной воронке |
entityType()->canAddItemsInCategory(int $entityTypeId, int $categoryId): bool |
Может ли пользователь создать и сохранить в базу данных элементы сущности $entityTypeId в воронке $categoryId . Вернет true , если у пользователя есть права на добавление элементов в этой воронке этой сущности |
entityType()->canUpdateItems(int $entityTypeId): bool |
Может ли пользователь изменять элементы сущности $entityTypeId . Вернет true , если у пользователя есть права на изменение элементов этой сущности. Если сущность поддерживает воронки, метод вернет true , если у пользователя есть права на изменение элементов хотя бы в одной воронке |
entityType()->canUpdateItemsInCategory(int $entityTypeId, int $categoryId): bool |
Может ли пользователь изменять элементы сущности $entityTypeId в воронке $categoryId . Вернет true , если у пользователя есть права на изменение элементов в этой воронке этой сущности |
entityType()->canDeleteItems(int $entityTypeId): bool |
Может ли пользователь удалять элементы сущности $entityTypeId . Вернет true , если у пользователя есть права на удаление элементов этой сущности. Если сущность поддерживает воронки, метод вернет true , если у пользователя есть права на удаление элементов хотя бы в одной воронке |
entityType()->canDeleteItemsInCategory(int $entityTypeId, int $categoryId): bool |
Может ли пользователь удалять элементы сущности $entityTypeId в воронке $categoryId . Вернет true , если у пользователя есть права на удаление элементов в этой воронке этой сущности |
entityType()->canExportItems(int $entityTypeId): bool |
Может ли пользователь экспортировать элементы сущности $entityTypeId . Вернет true , если у пользователя есть права на экспорт элементов этой сущности. Если сущность поддерживает воронки, метод вернет true , если у пользователя есть права на экспорт элементов хотя бы в одной воронке |
entityType()->canExportItemsInCategory(int $entityTypeId, int $categoryId): bool |
Может ли пользователь экспортировать элементы сущности $entityTypeId в воронке $categoryId . Вернет true , если у пользователя есть права на экспорт элементов в этой воронке этой сущности |
entityType()->canImportItems(int $entityTypeId): bool |
Может ли пользователь импортировать элементы в сущность $entityTypeId . Вернет true , если у пользователя есть права на импорт элементов для этой сущности. Если сущность поддерживает воронки, метод вернет true , если у пользователя есть права на импорт элементов хотя бы в одной воронке |
entityType()->canImportItemsInCategory(int $entityTypeId, int $categoryId): bool |
Может ли пользователь импортировать элементы в воронку $categoryId сущности $entityTypeId . Вернет true , если у пользователя есть права на импорт элементов в эту воронку этой сущности |
Содержит методы проверки прав доступа на добавление, изменение, удаление воронок .
Метод | Описание |
---|---|
category()->canAdd(\Bitrix\Crm\Category\Entity\Category $category): bool |
Может ли пользователь создать воронку, описываемую объектом $category |
category()->canUpdate(\Bitrix\Crm\Category\Entity\Category $category): bool |
Может ли пользователь изменить воронку, описываемую объектом $category |
category()->canDelete(\Bitrix\Crm\Category\Entity\Category $category): bool |
Может ли пользователь удалить воронку, описываемую объектом $category |
Содержит методы проверки прав доступа к управлению смарт-процессами.
Метод | Описание |
---|---|
dynamicType()->canAdd(?int $automatedSolutionId = null): bool |
Может ли пользователь создать и сохранить в базу данных новый смарт-процесс. Если передан $automatedSolutionId , проверяется доступ на добавление в цифровое рабочее место, иначе — в CRM |
dynamicType()->canUpdate(int $entityTypeId): bool |
Может ли пользователь изменить смарт-процесс $entityTypeId |
Миграция с более ранних версий
Начиная с версии crm 25.0.0 поведение сервиса UserPermissions изменилось. Далее приведена информация о соответствии между старыми и новыми методами.
Обратите внимание, что все старые методы в ближайшее время будут окончательно удалены и перестанут работать.
Метод | Использование |
---|---|
public function canWriteConfig(): bool |
Старая версия:$userPermissions->canWriteConfig() Актуальная версия: $userPermissions->isCrmAdmin() |
public function canReadType(int $entityTypeId): bool |
Старая версия:$userPermissions->canReadType(CCrmOwnerType::Deal) Актуальная версия: $userPermissions->entityType()->canReadItems(CCrmOwnerType::Deal) |
public function canReadTypeInCategory(int $entityTypeId, int $categoryId): bool |
Старая версия:$userPermissions->canReadTypeInCategory(CCrmOwnerType::Deal, 1) Актуальная версия: $userPermissions->entityType()->canReadTypeInCategory(CCrmOwnerType::Deal, 1) |
public function canAddType(): bool |
Старая версия:$userPermissions->canAddType() Актуальная версия: $userPermissions->dynamicType()->canAdd() |
public function canUpdateType(): bool |
Старая версия:$userPermissions->canUpdateType() Актуальная версия: $userPermissions->dynamicType()->canUpdate() |
public function canAddItem(Item $item): bool |
Старая версия:$userPermissions->canAddItem($item) Актуальная версия: $userPermissions->item()->canAddItem($item) |
public function canUpdateItem(Item $item): bool |
Старая версия:$userPermissions->canUpdateItem($item) Актуальная версия: $userPermissions->item()->canUpdateItem($item) |
public function canDeleteItem(Item $item): bool |
Старая версия:$userPermissions->canDeleteItem($item) Актуальная версия: $userPermissions->item()->canDeleteItem($item) |
public function canReadItem(Item $item): bool |
Старая версия:$userPermissions->canReadItem($item) Актуальная версия: $userPermissions->item()->canReadItem($item) |
public function checkAddPermissions(int $entityTypeId, int $categoryId = 0, ?string $stageId = null): bool |
Старая версия (только $entityTypeId ):$userPermissions->checkAddPermissions(CCrmOwnerType::Deal) Актуальная версия: $userPermissions->entityType()->canAddItems(CCrmOwnerType::Deal) Старая версия ( $entityTypeId и $categoryId ):$userPermissions->checkAddPermissions(CCrmOwnerType::Deal, 1) Актуальная версия: $userPermissions->entityType()->canAddItemsInCategory(CCrmOwnerType::Deal, 1) |
public function checkUpdatePermissions(int $entityTypeId, int $id, int $categoryId = 0): bool |
Старая версия (только $entityTypeId ):$userPermissions->checkUpdatePermissions(CCrmOwnerType::Deal) Актуальная версия: $userPermissions->entityType()->canUpdateItems(CCrmOwnerType::Deal) Старая версия ( $entityTypeId и $categoryId ):$userPermissions->checkUpdatePermissions(CCrmOwnerType::Deal, 0, 1) Актуальная версия: $userPermissions->entityType()->canUpdateItemsCategory(CCrmOwnerType::Deal, 1) Старая версия ( $entityTypeId и $id ):$userPermissions->checkUpdatePermissions(CCrmOwnerType::Deal, 2) Актуальная версия: $userPermissions->item()->canUpdate(CCrmOwnerType::Deal, 2) |
public function checkDeletePermissions(int $entityTypeId, int $id, int $categoryId = 0): bool |
Старая версия (только $entityTypeId ):$userPermissions->checkDeletePermissions(CCrmOwnerType::Deal) Актуальная версия: $userPermissions->entityType()->canDeleteItems(CCrmOwnerType::Deal) Старая версия ( $entityTypeId и $categoryId ):$userPermissions->checkDeletePermissions(CCrmOwnerType::Deal, 0, 1) Актуальная версия: $userPermissions->entityType()->canDeleteItemsCategory(CCrmOwnerType::Deal, 1) Старая версия ( $entityTypeId и $id ):$userPermissions->checkDeletePermissions(CCrmOwnerType::Deal, 2) Актуальная версия: $userPermissions->item()->canDelete(CCrmOwnerType::Deal, 2) |
public function checkReadPermissions(int $entityTypeId, int $id = 0, int $categoryId = 0): bool |
Старая версия (только $entityTypeId ):$userPermissions->checkReadPermissions(CCrmOwnerType::Deal) Актуальная версия: $userPermissions->entityType()->canReadItems(CCrmOwnerType::Deal) Старая версия ( $entityTypeId и $categoryId ):$userPermissions->checkReadPermissions(CCrmOwnerType::Deal, 0, 1) Актуальная версия: $userPermissions->entityType()->canReadItemsCategory(CCrmOwnerType::Deal, 1) Старая версия ( $entityTypeId и $id ):$userPermissions->checkReadPermissions(CCrmOwnerType::Deal, 2) Актуальная версия: $userPermissions->item()->canRead(CCrmOwnerType::Deal, 2) |
public function canViewItemsInCategory(Category $category): bool |
Старая версия:$userPermissions->canViewItemsInCategory($category) Актуальная версия: $userPermissions->category()->canReadItems($category) |
public function canAddCategory(Category $category): bool |
Старая версия:$userPermissions->canAddCategory($category) Актуальная версия: $userPermissions->category()->canAdd($category) |
public function canUpdateCategory(Category $category): bool |
Старая версия:$userPermissions->canUpdateCategory($category) Актуальная версия: $userPermissions->category()->canUpdate($category) |
public function canDeleteCategory(Category $category): bool |
Старая версия:$userPermissions->canDeleteCategory($category) Актуальная версия: $userPermissions->category()->canDelete($category) |
public function filterAvailableForReadingCategories(array $categories): array |
Старая версия:$userPermissions->canDeleteCategory($categories) Актуальная версия: $userPermissions->category()->canDelete($categories) |
public function getPermissionType(Item $item, string $operationType = self::OPERATION_READ): string |
Метод удален |
public function prepareItemPermissionAttributes(Item $item): array |
Метод удален |
public static function getItemPermissionEntityType(Item $item): string |
Метод удален. Используйте: \Bitrix\Crm\Category\PermissionEntityTypeHelper::getPermissionEntityTypeForItem($item) |
public static function getPermissionEntityType(int $entityTypeId, int $categoryId = 0): string |
Метод удален. Используйте: (new \Bitrix\Crm\Category\PermissionEntityTypeHelper($entityTypeId))->getPermissionEntityTypeForCategory($categoryId) |
public static function getEntityNameByPermissionEntityType(string $permissionEntityType): ?string |
Метод удален. Используйте: \Bitrix\Crm\Category\PermissionEntityTypeHelper::extractEntityAndCategoryFromPermissionEntityType($permissionEntityType) |
public function applyAvailableItemsFilter(?array $filter, array $permissionEntityTypes, ?string $operation = self::OPERATION_READ, ?string $primary = 'ID'): array |
Метод удален. Используйте: методы фабрики для выборок элементов CRM с учетом прав доступа, например: \Bitrix\Crm\Service\Container::getInstance()->getFactory(CCrmOwnerType::Deal)->getItemsFilteredByPermissions(['filter' => $filter]) |
public function getStartStageId(int $entityTypeId, EO_Status_Collection $stages, int $categoryId = 0, string $operation = self::OPERATION_ADD): ?string |
Метод удален |
public function canReadConfig(): bool |
Метод удален. Используйте: $userPermissions->entityType()->canReadSomeItemsInCrm() |
public function getCrmPermissions(): \CCrmPerms |
Класс CCrmPerms объявлен устаревшим и будет удален в ближайших обновлениях |