privileges)) { return []; } $privileges = json_decode($role->privileges, true); if (!is_array($privileges)) { return []; } // 转换为权限数组格式: controller.action $permissions = []; foreach ($privileges as $controller => $actions) { if (is_array($actions)) { foreach ($actions as $action) { $permissions[] = strtolower($controller . '.' . $action); } } } return $permissions; } /** * 检查是否超级管理员 */ private static function isSuperAdmin(int $roleId): bool { $superAdminIds = Config::get('menu.super_admin_role_ids', []); return in_array($roleId, $superAdminIds); } /** * 从菜单配置中提取所有权限 */ public static function getAllPermissions(): array { $permissions = []; $menus = Config::get('menu.menus', []); self::extractPermissions($menus, $permissions); return $permissions; } /** * 递归提取权限 */ private static function extractPermissions(array $menus, array &$permissions): void { foreach ($menus as $menu) { if (!empty($menu['controller']) && !empty($menu['actions'])) { $controller = $menu['controller']; if (!isset($permissions[$controller])) { $permissions[$controller] = [ 'name' => $menu['title'], 'actions' => [] ]; } foreach ($menu['actions'] as $action => $desc) { $permissions[$controller]['actions'][$action] = $desc; } } if (!empty($menu['children'])) { self::extractPermissions($menu['children'], $permissions); } } } /** * 检查用户权限 */ public static function checkPermission(int $userId, string $controller, string $action): bool { // 检查是否在白名单中 if (self::isWhitelisted($controller, $action)) { return true; } $roleId = getUserRoleId($userId); if (!$roleId) { return false; } // 超级管理员拥有所有权限 if (self::isSuperAdmin($roleId)) { return true; } // 获取用户权限 $permissions = self::getUserPermissions($roleId); $permission = strtolower($controller . '.' . $action); return in_array($permission, $permissions); } /** * 检查是否在白名单中 */ private static function isWhitelisted(string $controller, string $action): bool { $whitelist = Config::get('menu.permission_whitelist', []); // 检查控制器级别白名单 $controllers = $whitelist['controllers'] ?? []; if (in_array($controller, $controllers)) { return true; } // 检查具体方法白名单 $actions = $whitelist['actions'] ?? []; $current = $controller . '/' . $action; if (in_array($current, $actions)) { return true; } return false; } }