You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中比较信任策略时忽略Service数组元素顺序的实现

解决方案

先修正原代码里的变量名错误(trustPolicy应为obtainedPolicy,ExpectedPolicy应为ExpectedTrustPolicy),同时注意iam.getRole返回的结构中,AssumeRolePolicyDocument嵌套在Role对象下。针对Service数组顺序问题,以下是两种可行解决方式:

方案一:排序后进行深度比较

将预期和实际的Service数组统一排序,再用deepStrictEqual比较,即可忽略原始顺序:

const compareTrustPolicy = (RoleName) => {
    const ExpectedTrustPolicy = {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": ["service1", "service2"]
                },
                "Action": "sts:AssumeRole"
            }
        ]
    };

    return iam.getRole(RoleName).promise()
        .then((roleData) => {
            const obtainedPolicy = JSON.parse(decodeURIComponent(roleData.Role.AssumeRolePolicyDocument));
            
            // 复制数组并排序,避免修改原对象
            const sortedExpectedServices = [...ExpectedTrustPolicy.Statement[0].Principal.Service].sort();
            const sortedObtainedServices = [...obtainedPolicy.Statement[0].Principal.Service].sort();
            
            // 替换原数组为排序后的版本
            ExpectedTrustPolicy.Statement[0].Principal.Service = sortedExpectedServices;
            obtainedPolicy.Statement[0].Principal.Service = sortedObtainedServices;
            
            assert.deepStrictEqual(obtainedPolicy, ExpectedTrustPolicy, '信任策略不匹配');
        });
};

方案二:自定义验证逻辑(不修改原数组)

如果不想改动原数组顺序,可以单独验证Service数组的元素一致性,同时检查其他固定字段:

const compareTrustPolicy = (RoleName) => {
    const ExpectedTrustPolicy = {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": ["service1", "service2"]
                },
                "Action": "sts:AssumeRole"
            }
        ]
    };

    return iam.getRole(RoleName).promise()
        .then((roleData) => {
            const obtainedPolicy = JSON.parse(decodeURIComponent(roleData.Role.AssumeRolePolicyDocument));
            const expectedStmt = ExpectedTrustPolicy.Statement[0];
            const obtainedStmt = obtainedPolicy.Statement[0];

            // 验证基础字段一致性
            assert.strictEqual(obtainedPolicy.Version, ExpectedTrustPolicy.Version, 'Version不匹配');
            assert.strictEqual(obtainedStmt.Effect, expectedStmt.Effect, 'Effect不匹配');
            assert.strictEqual(obtainedStmt.Action, expectedStmt.Action, 'Action不匹配');
            
            // 验证Service数组元素完全一致(忽略顺序)
            const expectedServices = new Set(expectedStmt.Principal.Service);
            const obtainedServices = new Set(obtainedStmt.Principal.Service);
            
            assert.strictEqual(expectedServices.size, obtainedServices.size, 'Service数组长度不一致');
            for (const service of expectedServices) {
                assert.ok(obtainedServices.has(service), `缺失Service: ${service}`);
            }
        });
};

说明

  • 方案一操作简单,适合结构固定的信任策略验证;
  • 方案二更灵活,能精准控制每个字段的校验逻辑,适合复杂结构的场景。

内容的提问来源于stack exchange,提问作者raosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:15:32