PermissionService.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. namespace App\Services;
  3. /*
  4. * PermissionService — единый реестр прав доступа.
  5. *
  6. * Роли (по убыванию силы): superadmin → admin → editor → viewer
  7. * superadmin: все права автоматически
  8. * admin: всё кроме users.manage (если не выдано явно)
  9. * editor: управление контентом и автомобилями
  10. * viewer: только просмотр
  11. *
  12. * Индивидуальные overrides (user_permissions) перекрывают роль:
  13. * action=allow → разрешает, даже если роль не даёт
  14. * action=deny → запрещает, даже если роль разрешает
  15. *
  16. * superadmin НЕ может быть ограничен deny-записями.
  17. */
  18. use App\Models\User;
  19. class PermissionService
  20. {
  21. // Все доступные разрешения, сгруппированные по секции
  22. public static function all(): array
  23. {
  24. return [
  25. 'Автомобили' => [
  26. 'cars.view' => 'Просмотр каталога авто',
  27. 'cars.edit' => 'Управление авто (создание / редактирование / удаление)',
  28. ],
  29. 'Контент сайта' => [
  30. 'pages.view' => 'Просмотр страниц',
  31. 'pages.edit' => 'Редактирование страниц',
  32. 'blocks.view' => 'Просмотр блоков',
  33. 'blocks.edit' => 'Редактирование блоков',
  34. ],
  35. 'Справочники' => [
  36. 'manuals.view' => 'Просмотр справочников',
  37. 'manuals.edit' => 'Управление справочниками',
  38. ],
  39. 'Система' => [
  40. 'settings.view' => 'Просмотр настроек',
  41. 'settings.edit' => 'Изменение настроек',
  42. 'users.view' => 'Просмотр пользователей',
  43. 'users.manage' => 'Управление пользователями и правами',
  44. ],
  45. ];
  46. }
  47. // Плоский список ключей
  48. public static function keys(): array
  49. {
  50. return array_merge(...array_values(array_map('array_keys', static::all())));
  51. }
  52. // Права роли по умолчанию
  53. public static function roleDefaults(string $role): array
  54. {
  55. return match ($role) {
  56. 'superadmin' => static::keys(), // все
  57. 'admin' => [
  58. 'cars.view', 'cars.edit',
  59. 'pages.view', 'pages.edit',
  60. 'blocks.view', 'blocks.edit',
  61. 'manuals.view', 'manuals.edit',
  62. 'settings.view', 'settings.edit',
  63. 'users.view',
  64. // users.manage — только если выдано явно
  65. ],
  66. 'editor' => [
  67. 'cars.view', 'cars.edit',
  68. 'pages.view', 'pages.edit',
  69. 'blocks.view', 'blocks.edit',
  70. 'manuals.view',
  71. ],
  72. 'viewer' => [
  73. 'cars.view',
  74. 'pages.view',
  75. 'blocks.view',
  76. 'manuals.view',
  77. ],
  78. default => [],
  79. };
  80. }
  81. // Проверка: имеет ли пользователь конкретное право
  82. public static function userCan(User $user, string $permission): bool
  83. {
  84. // superadmin всегда может
  85. if ($user->role === 'superadmin') {
  86. return true;
  87. }
  88. // Нет роли — нет доступа в админку
  89. if (! $user->role) {
  90. return false;
  91. }
  92. // Индивидуальный override (кешируется в сессии через preloaded relation)
  93. $override = $user->userPermissions
  94. ->firstWhere('permission', $permission);
  95. if ($override) {
  96. return $override->action === 'allow';
  97. }
  98. // Дефолты роли
  99. return in_array($permission, static::roleDefaults($user->role), true);
  100. }
  101. // Метки ролей для UI
  102. public static function roleLabels(): array
  103. {
  104. return [
  105. 'superadmin' => ['label' => 'Главный администратор', 'color' => 'danger'],
  106. 'admin' => ['label' => 'Администратор', 'color' => 'warning'],
  107. 'editor' => ['label' => 'Редактор', 'color' => 'info'],
  108. 'viewer' => ['label' => 'Наблюдатель', 'color' => 'secondary'],
  109. ];
  110. }
  111. }