AWS Amplify Storage私有scope配置:如何让管理员/版主访问客户私有文件
解决方案
你要实现的权限逻辑不需要切换存储scope,仅需调整S3桶策略、对应Cognito用户组的IAM权限,再配合前端调用参数即可,具体操作如下:
步骤1:配置Cognito用户组的IAM权限
你提前为Admins、Moderators、Customers三个用户组配置了独立的IAM角色,只需为不同角色追加对应S3路径的访问权限:
- Admins组角色:添加S3全量操作权限,允许访问路径为
arn:aws:s3:::<你的存储桶名称>/private/*,开放操作包括s3:GetObject、s3:PutObject、s3:DeleteObject - Moderators组角色:添加S3只读权限,允许访问路径为
arn:aws:s3:::<你的存储桶名称>/private/*,仅开放操作s3:GetObject - Customers组角色:保留默认权限,仅允许访问路径
arn:aws:s3:::<你的存储桶名称>/private/${cognito-identity.amazonaws.com:sub}/*,开放操作s3:GetObject、s3:PutObject,移除s3:DeleteObject权限避免用户删除自有文件
步骤2:修改S3桶策略放行组权限
Amplify默认的S3桶策略会限制private路径仅文件所属用户可访问,你需要在桶策略中追加两条优先级更高的放行规则,允许Admins、Moderators组的角色访问所有private路径下的文件,避免默认规则拦截跨用户访问请求。
步骤3:调整前端文件访问逻辑
管理员、版主访问其他用户上传的私有文件时,调用Amplify Storage的相关方法需要额外传入文件所属用户的identityId参数:
// 拉取指定用户上传的私有文件 const fileUrl = await Storage.get('工单附件名称.png', { level: 'private', identityId: '<文件所属用户的Cognito Identity ID>' })
建议你在工单数据表中新增字段存储附件上传用户的Cognito Identity ID,方便后续权限校验和文件拉取。
步骤4:固化自定义配置避免被覆盖
为避免后续执行amplify push时自定义的策略被Amplify默认配置覆盖,可通过Amplify Override功能固化配置:
- 执行命令
amplify override storage生成存储覆写文件 - 在生成的
override.ts文件中添加自定义桶策略规则,示例如下:
import { AmplifyS3ResourceTemplate } from '@aws-amplify/cli-extensibility-helper'; export function override(resources: AmplifyS3ResourceTemplate) { // 放行管理员组所有private路径权限 resources.s3Bucket.bucketPolicy.addResource( "arn:aws:s3:::${bucketName}/private/*", ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"], { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<你的AWS账号ID>:role/<Admins组对应的IAM角色名称>" } } ); // 放行版主组private路径只读权限 resources.s3Bucket.bucketPolicy.addResource( "arn:aws:s3:::${bucketName}/private/*", ["s3:GetObject"], { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<你的AWS账号ID>:role/<Moderators组对应的IAM角色名称>" } } ); }
- 执行
amplify push提交配置即可生效。
内容的提问来源于stack exchange,提问作者marcotw
相关产品推荐
相关产品推荐

