如何通过Cognito身份池角色配置S3权限实现用户仅访问个人专属目录
S3结合Cognito用户专属目录权限配置方案
1. 确认Cognito身份池的角色关联配置
- 首先确保你的Cognito身份池的已认证用户角色关联正确,用户登录后获取的临时凭证默认关联该角色,所有权限规则优先配置在这个角色的权限策略中,无需额外在S3桶策略里重复配置(除非你需要限制更细的全局规则)
- 必须在Cognito身份池的「身份验证提供者」配置中,开启使用默认角色,或者配置对应的角色映射规则,确保用户能正确拿到你创建的角色的临时凭证
- 如果你的场景仅允许已登录用户访问,不要给未认证用户角色配置任何S3相关权限
2. 修正角色权限策略的关键配置
多数配置错误都是因为变量占位符写错,你可以直接用下面的策略模板替换你当前角色的权限策略,注意替换占位符:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::你的桶名称/${cognito-identity.amazonaws.com:sub}/*", "arn:aws:s3:::你的桶名称" ], "Condition": { "StringEquals": { "s3:prefix": ["${cognito-identity.amazonaws.com:sub}/", ""] } } } ] }
- 这里的
${cognito-identity.amazonaws.com:sub}就是Cognito为每个已认证用户生成的唯一身份ID,会自动和用户的专属目录名匹配,无需手动给每个用户创建规则 - ListBucket权限要额外加桶根路径的资源,同时用Condition限制只能查询自己目录下的对象,避免用户遍历整个桶的内容
3. 排查S3桶的额外限制
- 确认你的S3桶没有开启「阻止所有公共访问」之外的额外限制规则,如果桶本身有拒绝类的桶策略,优先级会高于角色权限,会直接拦截合法请求
- 确认你上传文件的时候,路径前缀完全匹配用户的Cognito身份ID,比如用户ID是
us-east-1:xxxx-xxxx-xxxx,那上传路径必须是s3://你的桶名/us-east-1:xxxx-xxxx-xxxx/文件名,前缀多一个字符少一个字符都会触发权限拒绝
4. 权限验证方式
可以先在IAM政策模拟器里选择你创建的Cognito角色,模拟s3:PutObject操作,资源填你测试用户的对应路径,看是否允许,能快速定位是策略配置错误还是前端请求的路径错误。
内容的提问来源于stack exchange,提问作者tjhack
相关产品推荐
相关产品推荐

