SVSP
TECHNOLOGIES

Документация

CrmDirectPermissions

Общее описание

Класс CrmDirectPermissions представляет собой сущность прямого права доступа в системе Ultralight CRM. Это техническая сущность, которая создается автоматически и используется для управления доступом к конкретным экземплярам сущностей.

Основная информация

Назначение

Сущность CrmDirectPermissions предназначена для:

Методы

groups()

Возвращает связь многие-ко-многим для соединения прямого правила доступа с группой пользователей.

Возвращает: Объект связи BelongsToMany

Пример использования:

// Получение всех групп, имеющих прямое право
$groups = $directPermission->groups;

// Добавление права к группе
$directPermission->groups()->attach($groupId);

// Удаление права из группы
$directPermission->groups()->detach($groupId);

Наследуемые методы от Entity

Класс наследует все методы от базового класса Entity:

initialize(int $id, int $typeId, bool $dnCheckRights = false)

Инициализирует экземпляр сущности с указанными параметрами.

Параметры:

getField(string $name)

Получает значение поля сущности по его имени.

Параметры:

Возвращает: Значение поля

setField(string $name, $value)

Устанавливает значение поля сущности.

Параметры:

delete()

Удаляет экземпляр сущности из базы данных.

save()

Сохраняет изменения в экземпляре сущности.

Поля сущности

Сущность CrmDirectPermissions содержит следующие поля:

Основные поля

Защищенные поля

Особенности реализации

  1. Техническая сущность — не содержит кастомной бизнес-логики, используется исключительно для хранения данных
  2. Интеграция с EntityTrait — использует trait для дополнительной функциональности
  3. Связь многие-ко-многим — реализована через связующую таблицу group_direct_permissions
  4. Автоматическое создание — таблица и сущность создаются автоматически при установке системы

Механизм работы

Связующая таблица

Связь между группами и прямыми правами реализована через таблицу group_direct_permissions со следующей структурой:

ПолеТипОписание
crm_group_idintegerИдентификатор группы
crm_direct_permission_idintegerИдентификатор прямого права

Принцип работы

  1. При создании прямого права создается запись в таблице crm_direct_permissions
  2. При назначении права группе создается запись в связующей таблице group_direct_permissions
  3. При проверке прав система сначала проверяет прямые права, затем общие права
  4. Прямые права имеют приоритет над общими правами для конкретной сущности

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

Создание прямого права

// Создание прямого права для конкретной сущности
$directPermission = EntityTable::createEntity(6, [
'entity_type_id' => 5, // Тип сущности "Проект"
'entity_id' => 10, // Конкретный проект с ID=10
'access_right' => 0 // Полный доступ
]);

// Назначение права группе
$directPermission->groups()->attach($groupId);

Получение прямых прав

// Получение всех прямых прав для типа сущности "Проект"
$directPermissions = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 6,
'FILTER' => [['entity_type_id', '=', 5]]
]);

// Получение прямых прав для конкретного проекта
$directPermissions = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 6,
'FILTER' => [
['entity_type_id', '=', 5],
['entity_id', '=', 10]
]
]);

Проверка прямых прав в CrmGroup

// В методе getEntityAccessRight класса CrmGroup
$dpermission = $this->directPermissions()
->where('entity_id', $entityId)
->where('entity_type_id', $entityTypeId)
->orderBy('access_right', 'asc')
->first();

if (isset($dpermission)) {
$permission = $dpermission;
}

Безопасность

Уровни доступа

УровеньЗначениеОписание
0Полный доступРазрешено чтение и запись
1Только чтениеРазрешено только чтение данных
2Доступ запрещенПолный запрет доступа

Механизм проверки

При проверке прав доступа:

  1. Система сначала ищет прямые права для конкретной сущности
  2. Если прямые права найдены, используется их уровень доступа
  3. Если прямые права не найдены, проверяются общие права для типа сущности
  4. Если права не найдены, доступ запрещен

Примеры сценариев

Сценарий 1: Конфиденциальный проект

// Создаем прямое право для конфиденциального проекта
$confidentialProject = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 5,
'FILTER' => [['id', '=', 100]]
])[0];

// Даем полный доступ менеджеру (группа с ID=3)
$directPermission = EntityTable::createEntity(6, [
'entity_type_id' => 5,
'entity_id' => 100,
'access_right' => 0
]);
$directPermission->groups()->attach(3);

// Остальные сотрудники имеют только чтение (через общие права)

Сценарий 2: Временный доступ

// Даем временный полный доступ разработчику для отладки
$directPermission = EntityTable::createEntity(6, [
'entity_type_id' => 3, // Тип "Клиент"
'entity_id' => 50, // Конкретный клиент
'access_right' => 0 // Полный доступ
]);
$directPermission->groups()->attach($developerGroupId);

// Через неделю удаляем прямое право
$directPermission->delete();

Рекомендации по использованию

  1. Используйте умеренно — прямые права усложняют управление доступом
  2. Документируйте — ведите реестр прямых прав для отслеживания безопасности
  3. Регулярно аудируйте — проверяйте актуальность прямых прав
  4. Учитывайте производительность — большое количество прямых прав может замедлить проверку доступа

Заключение

Сущность CrmDirectPermissions является важным компонентом системы управления правами доступа в Ultralight CRM. Она обеспечивает гибкую модель разграничения прав на уровне отдельных объектов, позволяя реализовать сложные сценарии авторизации. Благодаря своей простой структуре и интеграции с общей системой прав, сущность эффективно выполняет свою функцию контроля доступа к конкретным экземплярам сущностей.

SVSP
TECHNOLOGIES
Политика конфиденциальности
Политика конфиденциальности