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

如何使用AWS Amplify与S3私有存储,允许管理员访问所有用户文件

实现方案

1. 配置Cognito用户池组与角色映射

  • 首先在Cognito用户池中创建admin用户组,将需要授予全局读取权限的用户加入该组
  • 为admin组绑定专属的IAM角色,不要复用普通认证用户的默认角色
  • 进入Cognito身份池配置页,在「身份验证提供者」的用户池配置项中,选择角色获取来源为「用户池组的角色」,确保组角色优先级高于默认认证用户角色

2. 配置admin角色的IAM权限

给admin专属IAM角色添加如下权限策略,替换占位符为你自己的资源信息:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<你的Amplify存储桶名>",
        "arn:aws:s3:::<你的Amplify存储桶名>/private/*"
      ]
    },
    // 保留原有普通用户需要的其他权限,比如上传自己私有空间的权限等
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::<你的Amplify存储桶名>/private/${cognito-identity.amazonaws.com:sub}/*"
    }
  ]
}

3. 调整Amplify Storage调用逻辑

admin用户读取其他用户私有文件时,调用Storage.get或Storage.list需要额外指定目标用户的identityId参数:

// 读取指定用户的私有文件
const fileUrl = await Storage.get('目标文件名.jpg', {
  level: 'private',
  identityId: '目标用户的Cognito Identity ID' // 注意不是用户池的sub,是身份池分配的identityId
})

// 列出指定用户的所有私有文件
const fileList = await Storage.list('', {
  level: 'private',
  identityId: '目标用户的Cognito Identity ID'
})

如果需要批量获取所有用户的identityId,可以在用户首次登录时将identityId和用户信息绑定存储到业务数据库,供admin侧查询使用

4. 校验S3桶策略(可选)

如果你的S3桶配置了自定义桶策略,需要确认没有限制admin角色的访问权限,必要时可以添加如下桶策略规则:

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::<你的AWS账号ID>:role/<admin角色名>"
  },
  "Action": ["s3:GetObject", "s3:ListBucket"],
  "Resource": [
    "arn:aws:s3:::<你的Amplify存储桶名>",
    "arn:aws:s3:::<你的Amplify存储桶名>/private/*"
  ]
}

验证方法

admin用户登录后,可以调用Auth.currentUserCredentials()获取当前凭证,确认返回的角色ARN是你配置的admin专属角色ARN,再测试跨用户文件读取即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:15:03