| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <?php
- namespace App\Services;
- /*
- * PermissionService — единый реестр прав доступа.
- *
- * Роли (по убыванию силы): superadmin → admin → editor → viewer
- * superadmin: все права автоматически
- * admin: всё кроме users.manage (если не выдано явно)
- * editor: управление контентом и автомобилями
- * viewer: только просмотр
- *
- * Индивидуальные overrides (user_permissions) перекрывают роль:
- * action=allow → разрешает, даже если роль не даёт
- * action=deny → запрещает, даже если роль разрешает
- *
- * superadmin НЕ может быть ограничен deny-записями.
- */
- use App\Models\User;
- class PermissionService
- {
- // Все доступные разрешения, сгруппированные по секции
- public static function all(): array
- {
- return [
- 'Автомобили' => [
- 'cars.view' => 'Просмотр каталога авто',
- 'cars.edit' => 'Управление авто (создание / редактирование / удаление)',
- ],
- 'Контент сайта' => [
- 'pages.view' => 'Просмотр страниц',
- 'pages.edit' => 'Редактирование страниц',
- 'blocks.view' => 'Просмотр блоков',
- 'blocks.edit' => 'Редактирование блоков',
- ],
- 'Справочники' => [
- 'manuals.view' => 'Просмотр справочников',
- 'manuals.edit' => 'Управление справочниками',
- ],
- 'Система' => [
- 'settings.view' => 'Просмотр настроек',
- 'settings.edit' => 'Изменение настроек',
- 'users.view' => 'Просмотр пользователей',
- 'users.manage' => 'Управление пользователями и правами',
- ],
- ];
- }
- // Плоский список ключей
- public static function keys(): array
- {
- return array_merge(...array_values(array_map('array_keys', static::all())));
- }
- // Права роли по умолчанию
- public static function roleDefaults(string $role): array
- {
- return match ($role) {
- 'superadmin' => static::keys(), // все
- 'admin' => [
- 'cars.view', 'cars.edit',
- 'pages.view', 'pages.edit',
- 'blocks.view', 'blocks.edit',
- 'manuals.view', 'manuals.edit',
- 'settings.view', 'settings.edit',
- 'users.view',
- // users.manage — только если выдано явно
- ],
- 'editor' => [
- 'cars.view', 'cars.edit',
- 'pages.view', 'pages.edit',
- 'blocks.view', 'blocks.edit',
- 'manuals.view',
- ],
- 'viewer' => [
- 'cars.view',
- 'pages.view',
- 'blocks.view',
- 'manuals.view',
- ],
- default => [],
- };
- }
- // Проверка: имеет ли пользователь конкретное право
- public static function userCan(User $user, string $permission): bool
- {
- // superadmin всегда может
- if ($user->role === 'superadmin') {
- return true;
- }
- // Нет роли — нет доступа в админку
- if (! $user->role) {
- return false;
- }
- // Индивидуальный override (кешируется в сессии через preloaded relation)
- $override = $user->userPermissions
- ->firstWhere('permission', $permission);
- if ($override) {
- return $override->action === 'allow';
- }
- // Дефолты роли
- return in_array($permission, static::roleDefaults($user->role), true);
- }
- // Метки ролей для UI
- public static function roleLabels(): array
- {
- return [
- 'superadmin' => ['label' => 'Главный администратор', 'color' => 'danger'],
- 'admin' => ['label' => 'Администратор', 'color' => 'warning'],
- 'editor' => ['label' => 'Редактор', 'color' => 'info'],
- 'viewer' => ['label' => 'Наблюдатель', 'color' => 'secondary'],
- ];
- }
- }
|