AWS Amplify Granular Storage授权:能否绑定Cognito属性与用户组实现细粒度权限?
AWS Amplify Storage 自定义权限配置指引
核心问题明确答复
Amplify Storage默认提供的private、protected、public三类权限,是面向通用场景的简化模型,确实存在粒度不足的问题——既没办法匹配按Cognito自定义属性定向授权的需求,也没办法实现按用户组的精准权限控制。但这套能力是完全支持扩展的,和GraphQL模型的自定义权限实现逻辑同源,不存在能力上的缺口。
具体实现路径
按Cognito自定义属性绑定文件访问权限
Amplify Storage底层是S3托管桶,默认的三档权限本质是针对不同存储前缀的预置IAM规则,你完全可以在这个基础上叠加自定义规则,实现“仅对应companyID的用户可读取关联文件”的效果:
- 文件上传时,同步为S3对象写入绑定的标签(比如把当前用户的
custom:companyID值作为对象的companyID标签) - 在登录用户关联的IAM角色上添加带条件的授权规则,校验请求者的Cognito属性和对象标签的匹配关系,示例规则参考:
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的Amplify存储桶/业务文件目录/*", "Condition": { "StringEquals": { "s3:ExistingObjectTag/companyID": "${aws:PrincipalTag/custom:companyID}" } } }
这类校验是在IAM鉴权层强制执行的,前端无法绕过,授权粒度可以精细到单文件的单属性匹配。
按Cognito用户组配置全局权限
针对“仅Admins用户组拥有所有文件读写权限”的需求,同样可以通过IAM规则实现:
- 给Admins用户组关联的IAM角色添加带组校验条件的规则,示例参考:
{ "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"], "Resource": "arn:aws:s3:::你的Amplify存储桶/*", "Condition": { "StringEquals": { "aws:PrincipalTag/cognito:group": "Admins" } } }
配置注意事项
- 不要直接修改Amplify CLI自动生成的默认IAM规则,否则后续执行CLI更新时,自定义的修改会被默认配置覆盖,自定义规则建议单独做版本化留存
- 不要把敏感用户属性硬编码到文件路径中,通过S3对象标签做权限匹配,可以有效降低路径遍历类的安全风险
- 前端不需要额外开发复杂的鉴权拦截逻辑,用户完成Cognito登录后,所有文件访问请求都会由S3和IAM层自动完成权限校验,不符合规则的请求会直接被拦截
内容的提问来源于stack exchange,提问作者Luke Seemann
相关产品推荐
相关产品推荐

