Класс CrmAuthorization является центральным компонентом системы управления правами доступа в Ultralight CRM. Он отвечает за проверку прав пользователей при обращении к различным сущностям системы.
App\Models\CrmAuthorizationКласс CrmAuthorization предназначен для:
getAccess(int $entityTypeId, int $entityId = null): intФункция возвращает право доступа к указанной сущности для текущего авторизованного пользователя.
Параметры:
$entityTypeId — идентификатор типа сущности, права доступа к которой проверяются$entityId — идентификатор сущности, прямые права доступа к которой проверяются (необязательный)Возвращает: Уровень доступа (0 — полный доступ, 1 — чтение, 2 — запрещено)
Исключения:
Exception — если пользователь не авторизованЛогика работы:
Пример использования:
// Проверка прав доступа к сущности типа "Проект"
$accessLevel = CrmAuthorization::getAccess(5);
// Проверка прав доступа к конкретному проекту (ID: 10)
$accessLevel = CrmAuthorization::getAccess(5, 10);
isAdmin(): boolФункция проверяет, является ли авторизованный пользователь администратором.
Возвращает: true, если пользователь является администратором, иначе false
Исключения:
Exception — если пользователь не авторизованЛогика работы:
Пример использования:
// Проверка, является ли пользователь администратором
if (CrmAuthorization::isAdmin()) {
// Выполнение административных операций
}
Система использует три уровня доступа:
| Уровень | Описание |
|---|---|
| 0 | Полный доступ (чтение и запись) |
| 1 | Только чтение |
| 2 | Доступ запрещен |
<?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;
}
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'));
}
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 обеспечивает безопасность системы за счет:
Класс CrmAuthorization является ключевым компонентом системы безопасности Ultralight CRM. Он обеспечивает надежную и гибкую систему управления правами доступа, позволяя реализовать сложные сценарии авторизации при сохранении простоты использования. Благодаря своей архитектуре, класс легко расширяется и адаптируется под новые требования безопасности.