args[0] ?? 'app'; $scopesKey = $this->args[1] ?? 'scopes'; /** @var OpenApiApp|null $app */ $app = $this->validation->$appKey ?? null; if (!$app) { $this->addError('应用信息不存在,请先验证应用'); return false; } // 解析请求的权限范围 $requestedScopes = $this->parseScopes($value); // 如果没有请求权限,使用默认权限 if (empty($requestedScopes)) { $requestedScopes = $this->getDefaultScopes(); } // 验证权限范围格式 if (!$this->validateScopeFormat($requestedScopes)) { return false; } // 验证应用是否拥有请求的权限 if (!$this->validateAppPermissions($app, $requestedScopes)) { return false; } // 将处理后的权限范围保存到验证对象中 $this->validation->$scopesKey = $requestedScopes; return true; } /** * 解析权限范围字符串 * * @param string $scopeString * @return array */ protected function parseScopes(string $scopeString): array { if (empty($scopeString)) { return []; } // 按空格分割权限范围 $scopes = array_filter(array_map('trim', explode(' ', $scopeString))); // 去重并重新索引 return array_values(array_unique($scopes)); } /** * 获取默认权限范围 * * @return array */ protected function getDefaultScopes(): array { return ['USER_READ', 'GAME_READ']; } /** * 验证权限范围格式 * * @param array $scopes * @return bool */ protected function validateScopeFormat(array $scopes): bool { $validScopes = $this->getAllValidScopes(); foreach ($scopes as $scope) { if (!in_array($scope, $validScopes)) { $this->addError("无效的权限范围: {$scope}"); return false; } } return true; } /** * 验证应用是否拥有请求的权限 * * @param OpenApiApp $app * @param array $requestedScopes * @return bool */ protected function validateAppPermissions(OpenApiApp $app, array $requestedScopes): bool { $appScopes = $app->scopes ?? []; if (empty($appScopes)) { $this->addError('应用没有配置权限范围'); return false; } // 检查是否有管理员权限(拥有所有权限) if (in_array('ADMIN', $appScopes) || in_array('*', $appScopes)) { return true; } // 检查每个请求的权限 foreach ($requestedScopes as $scope) { if (!$this->hasScope($appScopes, $scope)) { $this->addError("应用缺少必需的权限范围: {$scope}"); return false; } } return true; } /** * 检查应用是否拥有指定权限 * * @param array $appScopes * @param string $requiredScope * @return bool */ protected function hasScope(array $appScopes, string $requiredScope): bool { // 直接拥有权限 if (in_array($requiredScope, $appScopes)) { return true; } // 检查权限依赖关系 return $this->checkScopeDependencies($appScopes, $requiredScope); } /** * 检查权限依赖关系 * * @param array $appScopes * @param string $requiredScope * @return bool */ protected function checkScopeDependencies(array $appScopes, string $requiredScope): bool { // 权限层级关系 $hierarchies = [ 'USER_READ' => ['USER_WRITE', 'USER_DELETE'], 'USER_WRITE' => ['USER_DELETE'], 'GAME_READ' => ['GAME_WRITE', 'GAME_ADMIN'], 'GAME_WRITE' => ['GAME_ADMIN'], 'ITEM_READ' => ['ITEM_WRITE', 'ITEM_TRANSFER'], 'ITEM_WRITE' => ['ITEM_TRANSFER'], 'FUND_READ' => ['FUND_WRITE', 'FUND_TRANSFER'], 'FUND_WRITE' => ['FUND_TRANSFER'], 'TRADE_READ' => ['TRADE_WRITE', 'TRADE_CANCEL'], 'TRADE_WRITE' => ['TRADE_CANCEL'], 'STATS_READ' => ['STATS_EXPORT'], 'SYSTEM_READ' => ['SYSTEM_ADMIN'], ]; // 检查是否有更高级的权限包含所需权限 if (isset($hierarchies[$requiredScope])) { foreach ($hierarchies[$requiredScope] as $higherScope) { if (in_array($higherScope, $appScopes)) { return true; } } } return false; } /** * 获取所有有效的权限范围 * * @return array */ protected function getAllValidScopes(): array { $scopes = array_column(SCOPE_TYPE::cases(), 'value'); // 添加特殊权限 $scopes[] = '*'; // 通配符权限 $scopes[] = 'ADMIN'; // 管理员权限 return $scopes; } }