| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- declare (strict_types=1);
- namespace app\service;
- use think\facade\Config;
- class PermissionService
- {
- /**
- * 获取所有权限配置
- */
- public static function getAllPermissions(): array
- {
- return Config::get('permission.permissions', []);
- }
- /**
- * 获取权限组配置
- */
- public static function getPermissionGroups(): array
- {
- return Config::get('permission.permission_groups', []);
- }
- /**
- * 根据权限组名获取权限配置
- */
- public static function getPermissionsByGroup($groupName): array
- {
- $groups = self::getPermissionGroups();
- return $groups[$groupName]['permissions'] ?? [];
- }
- /**
- * 验证权限格式
- */
- public static function validatePermissions($permissions): bool
- {
- if (!is_array($permissions)) {
- return false;
- }
- $allPermissions = self::getAllPermissions();
-
- foreach ($permissions as $controller => $actions) {
- // 检查控制器是否存在
- if (!isset($allPermissions[$controller])) {
- return false;
- }
-
- if (!is_array($actions)) {
- return false;
- }
-
- // 检查操作是否存在
- foreach ($actions as $action) {
- if (!isset($allPermissions[$controller]['actions'][$action])) {
- return false;
- }
- }
- }
-
- return true;
- }
- /**
- * 格式化权限为树形结构(用于前端显示)
- */
- public static function formatPermissionsToTree(): array
- {
- $permissions = self::getAllPermissions();
- $tree = [];
-
- foreach ($permissions as $controller => $config) {
- $controllerNode = [
- 'id' => $controller,
- 'title' => $config['name'],
- 'spread' => false,
- 'children' => []
- ];
-
- foreach ($config['actions'] as $action => $actionName) {
- $controllerNode['children'][] = [
- 'id' => $controller . '_' . $action,
- 'title' => $actionName,
- 'controller' => $controller,
- 'action' => $action
- ];
- }
-
- $tree[] = $controllerNode;
- }
-
- return $tree;
- }
- /**
- * 将用户权限格式化为前端可用的格式
- */
- public static function formatUserPermissions($userPermissions): array
- {
- $formatted = [];
-
- if (!is_array($userPermissions)) {
- return $formatted;
- }
-
- foreach ($userPermissions as $controller => $actions) {
- if (is_array($actions)) {
- foreach ($actions as $action) {
- $formatted[] = $controller . '_' . $action;
- }
- }
- }
-
- return $formatted;
- }
- /**
- * 将前端提交的权限格式转换为标准格式
- */
- public static function parsePermissionsFromFrontend($permissions): array
- {
- $parsed = [];
-
- if (!is_array($permissions)) {
- return $parsed;
- }
-
- foreach ($permissions as $permission) {
- if (strpos($permission, '_') !== false) {
- [$controller, $action] = explode('_', $permission, 2);
-
- if (!isset($parsed[$controller])) {
- $parsed[$controller] = [];
- }
-
- if (!in_array($action, $parsed[$controller])) {
- $parsed[$controller][] = $action;
- }
- }
- }
-
- return $parsed;
- }
- /**
- * 合并权限
- */
- public static function mergePermissions($permissions1, $permissions2): array
- {
- $merged = $permissions1;
-
- foreach ($permissions2 as $controller => $actions) {
- if (!isset($merged[$controller])) {
- $merged[$controller] = [];
- }
-
- $merged[$controller] = array_unique(array_merge($merged[$controller], $actions));
- }
-
- return $merged;
- }
- /**
- * 检查权限包含关系
- */
- public static function hasPermission($userPermissions, $controller, $action): bool
- {
- return isset($userPermissions[$controller]) &&
- is_array($userPermissions[$controller]) &&
- in_array($action, $userPermissions[$controller]);
- }
- /**
- * 获取用户所有可访问的控制器
- */
- public static function getUserAccessibleControllers($userPermissions): array
- {
- return array_keys($userPermissions);
- }
- /**
- * 获取控制器的所有可访问操作
- */
- public static function getControllerAccessibleActions($userPermissions, $controller): array
- {
- return $userPermissions[$controller] ?? [];
- }
- }
|