基于组的S3访问控制:突破配额实现分层权限管控
可落地方案:动态权限下沉,绕开原生配额限制
架构核心逻辑
完全抛弃依赖Cognito静态组、S3独立存储桶做权限映射的传统模式,将权限判定从AWS原生配置层转移至自有业务服务层,从根源适配两类配额限制:
- 全量宠物资源统一存储在1个或极少量通用S3桶中,按
{宠物类型}/{品种}的层级前缀划分路径,永远不触发100个存储桶的默认配额上限 - 用户与可访问路径的对应关系全部存储在自有业务数据库,完全不依赖Cognito的用户组机制,彻底规避单用户池10000个组的配额瓶颈
程序化权限实现流程
- 身份认证层:保留Cognito User Pool承担基础用户登录能力,登录后返回的ID Token仅用于核验用户身份,不附带任何权限类声明
- 权限校验服务:客户端拿到ID Token后,调用自有后端服务申请S3访问权限,后端先校验Token有效性,再从业务库查询当前用户的可访问路径前缀列表(例如虎斑猫用户的可访问前缀为
Cats/、Cats/TabbyCats/) - 动态临时凭证签发:后端基于查询到的权限列表,通过
sts:AssumeRole动态生成自定义权限的临时会话,权限策略严格限定当前用户的可访问范围:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::your-general-pet-asset-bucket", "arn:aws:s3:::your-general-pet-asset-bucket/Cats/*", "arn:aws:s3:::your-general-pet-asset-bucket/Cats/TabbyCats/*" ], "Condition": { "StringLike": { "s3:prefix": ["Cats/", "Cats/TabbyCats/"] } } } ] } - S3访问执行:客户端拿到临时凭证后直接对接S3,所有不在权限范围内的路径(如
Dogs/、Cats/CalicoCats/)会被S3原生权限校验直接拦截,无需额外桶级配置
方案配额适配验证
- S3维度:无论宠物类型、品种的细分规模达到多少,仅需1个通用存储桶即可承载全量资源,远低于默认100个桶的配额要求,无需申请提额、无额外成本
- Cognito维度:完全不使用Cognito的组关联权限逻辑,用户的细分权限全部存储在业务侧,哪怕细分分类规模达到10万级,也不会触发单池10000个组的配额上限
可选安全优化
如果不想给用户发放长期有效的临时凭证,可切换为S3预签名URL模式:用户每次访问具体文件前,向后端请求临时访问链接,后端先校验当前用户对目标路径的访问权限,校验通过后生成有效期15分钟的预签名URL,权限管控粒度更细。
注:这套架构完全覆盖两级隔离需求——猫类用户的权限列表仅包含
Cats/及对应品种的子路径,无法访问其他宠物类型的目录;同类型下不同品种的用户也无法跨品种访问专属文件夹。
内容的提问来源于stack exchange,提问作者Xonu
相关产品推荐
相关产品推荐

