SVSP
TECHNOLOGIES

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

CrmAuthorization

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

Класс CrmAuthorization является центральным компонентом системы управления правами доступа в Ultralight CRM. Он отвечает за проверку прав пользователей при обращении к различным сущностям системы.

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

Назначение

Класс CrmAuthorization предназначен для:

Методы

getAccess(int $entityTypeId, int $entityId = null): int

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

Параметры:

Возвращает: Уровень доступа (0 — полный доступ, 1 — чтение, 2 — запрещено)

Исключения:

Логика работы:

  1. Проверяет, является ли запрос CLI-командой или пользователь администратором (возвращает 0)
  2. Получает текущего авторизованного пользователя
  3. Инициализирует данные пользователя (typeID, entityId, fieldsInfo)
  4. Получает группы, к которым принадлежит пользователь
  5. Находит минимальное право доступа среди всех групп пользователя
  6. Возвращает найденный уровень доступа

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

// Проверка прав доступа к сущности типа "Проект"
$accessLevel = CrmAuthorization::getAccess(5);

// Проверка прав доступа к конкретному проекту (ID: 10)
$accessLevel = CrmAuthorization::getAccess(5, 10);

isAdmin(): bool

Функция проверяет, является ли авторизованный пользователь администратором.

Возвращает: true, если пользователь является администратором, иначе false

Исключения:

Логика работы:

  1. Получает текущего авторизованного пользователя
  2. Инициализирует данные пользователя (typeID, entityId, fieldsInfo)
  3. Получает группы пользователя
  4. Проверяет наличие группы с ID = 1 (группа администраторов)
  5. Возвращает результат проверки

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

// Проверка, является ли пользователь администратором
if (CrmAuthorization::isAdmin()) {
// Выполнение административных операций
}

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

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

Система использует три уровня доступа:

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

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

  1. Приоритет прав — если пользователь имеет разные права из разных групп, применяется наименьший уровень доступа
  2. CLI-доступ — команды командной строки всегда имеют полный доступ
  3. Администраторы — пользователи в группе с ID = 1 имеют полный доступ ко всем сущностям
  4. Групповая модель — права проверяются для всех групп, к которым принадлежит пользователь

Алгоритм проверки прав

<?php

function getAccess($entityTypeId, $entityId = null) {
// 1. CLI и администраторы - полный доступ
if (php_sapi_name() === 'cli' || isAdmin()) {
return 0;
}

// 2. Проверка авторизации
$user = Auth::user();
if (!$user) {
throw new Exception("Access denied: user not authorized");
}

// 3. Инициализация данных пользователя
$user->typeID = 1;
$user->entityId = $user->getAuthIdentifier();
$etb = new EntityTypes();
$user->fieldsInfo = $etb->getTypeInfo(1);

// 4. Получение групп пользователя
$ugroups = $user->groups()->pluck('crm_group_id')->toArray();

// 5. Поиск минимального права доступа
$minAccessRight = 2;
foreach ($ugroups as $groupId) {
if (empty($groupId)) continue;

$groups = EntityTable::getEntities([
"ENTITY_TYPE_ID" => 2,
"FILTER" => [["id", "=", $groupId]]
], true);

if (!empty($groups)) {
$accessRight = $groups[0]->getEntityAccessRight($entityTypeId, $entityId);
if ($accessRight < $minAccessRight) {
$minAccessRight = $accessRight;
if ($minAccessRight === 0) break; // Оптимизация
}
}
}

return $minAccessRight;
}

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

  1. Статический класс — все методы являются статическими, что позволяет использовать их без создания экземпляра
  2. Интеграция с Laravel Auth — использует стандартную систему аутентификации Laravel
  3. Оптимизация производительности — при нахождении права с уровнем 0 (полный доступ) цикл прерывается
  4. Безопасность по умолчанию — если права не найдены, возвращается уровень 2 (доступ запрещен)

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

В контроллерах

public function showProject($id)
{
$accessLevel = CrmAuthorization::getAccess(5, $id);

if ($accessLevel === 2) {
abort(403, 'Доступ запрещен');
}

$project = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 5,
'FILTER' => [['id', '=', $id]]
]);

return view('project.show', compact('project'));
}

В middleware

public function handle($request, Closure $next)
{
if (CrmAuthorization::getAccess($this->entityTypeId) === 2) {
return redirect('/workspace')->with('error', 'У вас нет доступа к этому разделу');
}

return $next($request);
}

В шаблонах

{{-- Отображение элементов управления только при наличии прав --}}
@if(CrmAuthorization::getAccess(5) === 0)
<button class="btn btn-primary" onclick="createProject()">Создать проект</button>
@endif

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

Класс CrmAuthorization обеспечивает безопасность системы за счет:

  1. Централизованной проверки прав — вся логика авторизации сосредоточена в одном классе
  2. Проверки на каждом уровне — права проверяются при каждом обращении к защищенным ресурсам
  3. Гибкой модели прав — поддержка групповой модели с различными уровнями доступа
  4. Защиты от обхода — даже при прямом обращении к сущностям права проверяются

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

  1. Всегда проверяйте права — перед выполнением любой операции с данными
  2. Используйте кэширование — для часто проверяемых прав (с учетом изменения прав в реальном времени)
  3. Обрабатывайте исключения — корректно обрабатывайте случаи отсутствия авторизации
  4. Документируйте политики — ведите реестр прав доступа для различных сущностей

Заключение

Класс CrmAuthorization является ключевым компонентом системы безопасности Ultralight CRM. Он обеспечивает надежную и гибкую систему управления правами доступа, позволяя реализовать сложные сценарии авторизации при сохранении простоты использования. Благодаря своей архитектуре, класс легко расширяется и адаптируется под новые требования безопасности.

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