[ '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'], ]; } }