You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Cognito和IAM实现DynamoDB的项目级细粒度访问控制?

实现方案

最简实现方案

结合AWS Cognito自定义属性与IAM细粒度策略,具体步骤如下:

  • 步骤1:给Cognito用户添加自定义属性
    在用户池的属性设置里,添加两个自定义属性:custom:role(存储用户角色:viewer/editor/super-editor)和custom:projects(存储用户可访问的项目代码,用逗号分隔,比如#PR001,#PR003,#PR005)。由于用户规模小,直接在Cognito控制台手动为每个用户配置这些属性即可。
  • 步骤2:编写IAM访问策略
    为访问DynamoDB的IAM角色(比如用户身份池对应的角色)添加带条件的权限策略,根据用户的角色和项目列表限制访问:
    示例策略:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "dynamodb:GetItem",
                    "dynamodb:Query",
                    "dynamodb:Scan"
                ],
                "Resource": "arn:aws:dynamodb:REGION:ACCOUNT_ID:table/YOUR_TABLE",
                "Condition": {
                    "ForAllValues:StringEquals": {
                        "dynamodb:LeadingKeys": "${cognito-identity.amazonaws.com:custom:projects}"
                    },
                    "StringEquals": {
                        "cognito-identity.amazonaws.com:custom:role": "viewer"
                    }
                }
            },
            {
                "Effect": "Allow",
                "Action": [
                    "dynamodb:GetItem",
                    "dynamodb:Query",
                    "dynamodb:Scan",
                    "dynamodb:PutItem",
                    "dynamodb:UpdateItem"
                ],
                "Resource": "arn:aws:dynamodb:REGION:ACCOUNT_ID:table/YOUR_TABLE",
                "Condition": {
                    "ForAllValues:StringEquals": {
                        "dynamodb:LeadingKeys": "${cognito-identity.amazonaws.com:custom:projects}"
                    },
                    "StringEquals": {
                        "cognito-identity.amazonaws.com:custom:role": "editor"
                    }
                }
            },
            {
                "Effect": "Allow",
                "Action": [
                    "dynamodb:*"
                ],
                "Resource": "arn:aws:dynamodb:REGION:ACCOUNT_ID:table/YOUR_TABLE",
                "Condition": {
                    "ForAllValues:StringEquals": {
                        "dynamodb:LeadingKeys": "${cognito-identity.amazonaws.com:custom:projects}"
                    },
                    "StringEquals": {
                        "cognito-identity.amazonaws.com:custom:role": "super-editor"
                    }
                }
            }
        ]
    }
    
    注:编辑器需要"部分数据编辑"的话,仅靠IAM策略无法实现字段级限制,这部分可以在应用层处理——接收更新请求时,检查用户角色,只允许修改指定字段;或者结合DynamoDB的条件表达式,在更新操作时限制可修改的属性。

能否在DynamoDB存储项目访问列表?是否安全?

完全可以,具体做法:

  • 创建一个单独的用户权限表,主键用user_id,属性包含role和projects(数组类型存储项目代码)。
  • 访问业务数据之前,后端服务先查询这个权限表,获取当前用户的可访问项目和角色,再在应用层过滤业务数据请求,或者结合DynamoDB的查询条件(比如只查询用户可访问的项目代码)。

安全性说明:

  • 只要正确配置IAM策略,限制只有你的后端服务能读写这个权限表,普通用户无法直接访问或修改该表,就是安全的。
  • 禁止将权限表的信息返回给前端,所有权限校验逻辑都在后端完成,防止前端篡改权限数据。
  • 对比Cognito自定义属性的方式,DynamoDB存储权限表的优势是更灵活(比如支持更复杂的权限规则),但需要额外维护一张表,且每次访问业务数据前多一次查询操作——鉴于你的用户规模小,这种额外开销完全可以接受。

补充建议

  • 如果你需要更灵活的权限管理(比如后续用户规模扩大,或权限规则变复杂),可以考虑引入AWS IAM Access Analyzer验证策略的正确性,或者结合AWS AppSync的细粒度访问控制(AppSync可以直接基于Cognito claims做权限判断)。
  • 无论用哪种方式,都要定期审计权限配置,确保没有多余的权限被授予。

内容的提问来源于stack exchange,提问作者redfuse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:35:40