insertGetId([ 'title' => 'apt' . uniqid(), 'status' => 2, // system_auth 枚举:1=禁用 2=启用 'sort' => 100, 'create_time' => time(), 'update_time' => time(), 'delete_time' => 0, ]); foreach (self::ALLOWED_ACTIONS as $action) { Db::name('system_auth_node')->insert([ 'auth_id' => $roleId, 'node' => self::CONTROLLER . '/' . $action, ]); } return Db::name('system_admin')->insertGetId([ 'username' => 'apt_' . uniqid(), 'password' => 'should-not-leak', 'auth_ids' => (string) $roleId, 'status' => 1, 'create_time' => time(), 'update_time' => time(), 'delete_time' => 0, ]); } // ========================================================================= // a) 超管 // ========================================================================= public function test_super_admin_payload_is_all_true(): void { $service = new AuthService(AdminConstant::SUPER_ADMIN_ID); $payload = $service->getAuthPayload(); $this->assertTrue($payload['all']); $this->assertSame([], $payload['nodes']); } // ========================================================================= // b) 普通管理员:按角色授权精确聚合 // ========================================================================= public function test_restricted_admin_payload_contains_only_seeded_nodes(): void { $adminId = $this->createRestrictedAdmin(); $service = new AuthService($adminId); $payload = $service->getAuthPayload(); $this->assertFalse($payload['all']); $this->assertArrayHasKey(self::CONTROLLER, $payload['nodes'], 'payload: ' . json_encode($payload, JSON_UNESCAPED_SLASHES)); $this->assertCount( count(self::ALLOWED_ACTIONS), $payload['nodes'][self::CONTROLLER], 'payload: ' . json_encode($payload, JSON_UNESCAPED_SLASHES) ); $this->assertEqualsCanonicalizing(self::ALLOWED_ACTIONS, $payload['nodes'][self::CONTROLLER]); foreach (self::FORBIDDEN_ACTIONS as $action) { $this->assertNotContains($action, $payload['nodes'][self::CONTROLLER]); } } // ========================================================================= // c) 载荷格式契约 // ========================================================================= public function test_payload_nodes_format_contract(): void { $adminId = $this->createRestrictedAdmin(); $service = new AuthService($adminId); $payload = $service->getAuthPayload(); $this->assertFalse($payload['all']); $this->assertIsArray($payload['nodes']); $this->assertNotEmpty($payload['nodes'], '受限管理员 nodes 不应为空'); foreach ($payload['nodes'] as $controller => $actions) { $this->assertIsString($controller); $this->assertStringNotContainsString('/', $controller, '控制器键不得含 /'); $this->assertIsArray($actions); $this->assertNotEmpty($actions); foreach ($actions as $action) { $this->assertIsString($action); $this->assertNotSame('', $action, '动作不得为空字符串'); } } } }