如何使用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
相关产品推荐
相关产品推荐

