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

如何使用AWS SDK V3 JavaScript获取权限集关联策略的操作权限

获取AWS SSO权限集的操作权限(JavaScript SDK v3实现)

核心逻辑

SSO权限集的权限来自两类:内嵌策略和关联的托管策略,需要分别获取这两类策略文档后,解析出其中的操作权限列表。

步骤1:初始化SDK客户端

先创建SSO Admin和IAM的客户端实例,注意SSO Admin客户端的区域要和你的SSO实例区域一致。

import { SSOAdminClient, DescribePermissionSetCommand, ListManagedPoliciesInPermissionSetCommand } from "@aws-sdk/client-sso-admin";
import { IAMClient, GetPolicyCommand, GetPolicyVersionCommand } from "@aws-sdk/client-iam";

// 替换为你的SSO实例所在区域
const ssoAdminClient = new SSOAdminClient({ region: "us-east-1" });
const iamClient = new IAMClient({ region: "us-east-1" });

步骤2:获取权限集的关联策略信息

先拿到权限集的内嵌策略,再获取所有关联的托管策略ARN列表。

async function getPermissionSetPolicySources(instanceArn, permissionSetArn) {
  // 获取权限集详情,包含内嵌策略
  const describeCmd = new DescribePermissionSetCommand({
    InstanceArn: instanceArn,
    PermissionSetArn: permissionSetArn
  });
  const describeRes = await ssoAdminClient.send(describeCmd);
  const inlinePolicy = describeRes.PermissionSet.InlinePolicy;

  // 获取关联的托管策略ARN
  const listManagedCmd = new ListManagedPoliciesInPermissionSetCommand({
    InstanceArn: instanceArn,
    PermissionSetArn: permissionSetArn
  });
  const managedRes = await ssoAdminClient.send(listManagedCmd);
  const managedPolicyArns = managedRes.AttachedManagedPolicies?.map(p => p.PolicyArn) || [];

  return { inlinePolicy, managedPolicyArns };
}

步骤3:解析策略文档中的操作权限

写一个通用函数,从策略文档里提取所有Effect: Allow的操作,兼容单个字符串或数组形式的Action字段。

function extractActions(policyDoc) {
  const actions = new Set();
  const policy = JSON.parse(policyDoc);

  if (!policy.Statement) return [];
  const statements = Array.isArray(policy.Statement) ? policy.Statement : [policy.Statement];

  statements.forEach(statement => {
    if (statement.Effect !== "Allow") return;
    const action = statement.Action;
    if (typeof action === "string") {
      actions.add(action);
    } else if (Array.isArray(action)) {
      action.forEach(a => actions.add(a));
    }
  });

  return Array.from(actions).sort();
}

步骤4:获取托管策略的完整文档

托管策略需要先获取默认版本ID,再拉取对应版本的策略文档(注意文档是URL编码的,需要解码)。

async function getManagedPolicyContent(policyArn) {
  // 获取策略默认版本ID
  const getPolicyCmd = new GetPolicyCommand({ PolicyArn: policyArn });
  const policyRes = await iamClient.send(getPolicyCmd);
  const defaultVersionId = policyRes.Policy.DefaultVersionId;

  // 获取策略版本文档
  const getVersionCmd = new GetPolicyVersionCommand({
    PolicyArn: policyArn,
    VersionId: defaultVersionId
  });
  const versionRes = await iamClient.send(getVersionCmd);
  
  return decodeURIComponent(versionRes.PolicyVersion.Document);
}

步骤5:整合逻辑,输出所有操作权限

把上面的函数组合起来,一次性获取权限集的所有操作。

async function listAllPermissionSetActions(instanceArn, permissionSetArn) {
  const { inlinePolicy, managedPolicyArns } = await getPermissionSetPolicySources(instanceArn, permissionSetArn);
  
  const allActions = new Set();

  // 处理内嵌策略
  if (inlinePolicy) {
    const inlineActions = extractActions(inlinePolicy);
    inlineActions.forEach(a => allActions.add(a));
  }

  // 处理每个托管策略
  for (const arn of managedPolicyArns) {
    const policyDoc = await getManagedPolicyContent(arn);
    const managedActions = extractActions(policyDoc);
    managedActions.forEach(a => allActions.add(a));
  }

  return Array.from(allActions).sort();
}

// 调用示例:替换成你的SSO实例ARN和权限集ARN
const instanceArn = "arn:aws:sso:::instance/ssoins-xxxxxx";
const permissionSetArn = "arn:aws:sso:::permissionSet/ssoins-xxxxxx/ps-xxxxxx";

listAllPermissionSetActions(instanceArn, permissionSetArn)
  .then(actions => {
    console.log("权限集拥有的操作权限:");
    actions.forEach(action => console.log(`- ${action}`));
  })
  .catch(err => {
    console.error("获取失败:", err);
  });

注意事项

  • 执行代码的角色必须拥有以下权限:sso:DescribePermissionSet、sso:ListManagedPoliciesInPermissionSet、iam:GetPolicy、iam:GetPolicyVersion
  • 如果权限集包含ABAC动态权限(基于标签/属性的条件),上述代码仅提取明确的Action,不会处理条件限制
  • 策略中的通配符(如s3:*)会直接保留,如需展开具体操作需要额外处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:50:26