PermissionService.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\service;
  4. use think\facade\Config;
  5. class PermissionService
  6. {
  7. /**
  8. * 获取所有权限配置
  9. */
  10. public static function getAllPermissions(): array
  11. {
  12. return Config::get('permission.permissions', []);
  13. }
  14. /**
  15. * 获取权限组配置
  16. */
  17. public static function getPermissionGroups(): array
  18. {
  19. return Config::get('permission.permission_groups', []);
  20. }
  21. /**
  22. * 根据权限组名获取权限配置
  23. */
  24. public static function getPermissionsByGroup($groupName): array
  25. {
  26. $groups = self::getPermissionGroups();
  27. return $groups[$groupName]['permissions'] ?? [];
  28. }
  29. /**
  30. * 验证权限格式
  31. */
  32. public static function validatePermissions($permissions): bool
  33. {
  34. if (!is_array($permissions)) {
  35. return false;
  36. }
  37. $allPermissions = self::getAllPermissions();
  38. foreach ($permissions as $controller => $actions) {
  39. // 检查控制器是否存在
  40. if (!isset($allPermissions[$controller])) {
  41. return false;
  42. }
  43. if (!is_array($actions)) {
  44. return false;
  45. }
  46. // 检查操作是否存在
  47. foreach ($actions as $action) {
  48. if (!isset($allPermissions[$controller]['actions'][$action])) {
  49. return false;
  50. }
  51. }
  52. }
  53. return true;
  54. }
  55. /**
  56. * 格式化权限为树形结构(用于前端显示)
  57. */
  58. public static function formatPermissionsToTree(): array
  59. {
  60. $permissions = self::getAllPermissions();
  61. $tree = [];
  62. foreach ($permissions as $controller => $config) {
  63. $controllerNode = [
  64. 'id' => $controller,
  65. 'title' => $config['name'],
  66. 'spread' => false,
  67. 'children' => []
  68. ];
  69. foreach ($config['actions'] as $action => $actionName) {
  70. $controllerNode['children'][] = [
  71. 'id' => $controller . '_' . $action,
  72. 'title' => $actionName,
  73. 'controller' => $controller,
  74. 'action' => $action
  75. ];
  76. }
  77. $tree[] = $controllerNode;
  78. }
  79. return $tree;
  80. }
  81. /**
  82. * 将用户权限格式化为前端可用的格式
  83. */
  84. public static function formatUserPermissions($userPermissions): array
  85. {
  86. $formatted = [];
  87. if (!is_array($userPermissions)) {
  88. return $formatted;
  89. }
  90. foreach ($userPermissions as $controller => $actions) {
  91. if (is_array($actions)) {
  92. foreach ($actions as $action) {
  93. $formatted[] = $controller . '_' . $action;
  94. }
  95. }
  96. }
  97. return $formatted;
  98. }
  99. /**
  100. * 将前端提交的权限格式转换为标准格式
  101. */
  102. public static function parsePermissionsFromFrontend($permissions): array
  103. {
  104. $parsed = [];
  105. if (!is_array($permissions)) {
  106. return $parsed;
  107. }
  108. foreach ($permissions as $permission) {
  109. if (strpos($permission, '_') !== false) {
  110. [$controller, $action] = explode('_', $permission, 2);
  111. if (!isset($parsed[$controller])) {
  112. $parsed[$controller] = [];
  113. }
  114. if (!in_array($action, $parsed[$controller])) {
  115. $parsed[$controller][] = $action;
  116. }
  117. }
  118. }
  119. return $parsed;
  120. }
  121. /**
  122. * 合并权限
  123. */
  124. public static function mergePermissions($permissions1, $permissions2): array
  125. {
  126. $merged = $permissions1;
  127. foreach ($permissions2 as $controller => $actions) {
  128. if (!isset($merged[$controller])) {
  129. $merged[$controller] = [];
  130. }
  131. $merged[$controller] = array_unique(array_merge($merged[$controller], $actions));
  132. }
  133. return $merged;
  134. }
  135. /**
  136. * 检查权限包含关系
  137. */
  138. public static function hasPermission($userPermissions, $controller, $action): bool
  139. {
  140. return isset($userPermissions[$controller]) &&
  141. is_array($userPermissions[$controller]) &&
  142. in_array($action, $userPermissions[$controller]);
  143. }
  144. /**
  145. * 获取用户所有可访问的控制器
  146. */
  147. public static function getUserAccessibleControllers($userPermissions): array
  148. {
  149. return array_keys($userPermissions);
  150. }
  151. /**
  152. * 获取控制器的所有可访问操作
  153. */
  154. public static function getControllerAccessibleActions($userPermissions, $controller): array
  155. {
  156. return $userPermissions[$controller] ?? [];
  157. }
  158. }