如何在Amplify GraphQL API中限制单用户可创建的记录数量
问题解答
核心结论
不能仅通过GraphQL Schema定义实现单用户创建记录条数限制,也没有原生的DynamoDB配置项支持该能力,需要通过附加后端校验逻辑实现强制限制,以下是两种适配Amplify生态的可行方案:
方案1:前置Lambda校验(适配绝大多数普通场景)
这是实现成本最低的方案,适合并发量不高的业务:
- 给Product对应的DynamoDB表新增
owner字段的全局二级索引,用于快速统计单个用户的记录总数 - 在Amplify项目中新增一个Lambda校验函数,逻辑如下:
- 从GraphQL请求上下文中提取当前Cognito用户的
owner标识 - 调用DynamoDB接口查询该用户已创建的Product记录总数
- 若总数≥100,直接返回拒绝请求的报错;若<100则放行请求
- 从GraphQL请求上下文中提取当前Cognito用户的
- 将该Lambda函数关联到
createProductmutation的前置Resolver,所有创建Product的请求都会先经过该函数校验,通过后才会写入数据库
方案2:计数表+DynamoDB事务(高并发场景强一致限制)
如果业务存在高并发创建请求的场景,方案1的查询和写入存在时间差,极端情况下可能出现超限,可以用事务实现绝对严格的限制:
- 新建一张
UserProductCountDynamoDB表,主键为用户的owner标识,存储每个用户已创建的Product数量,初始值为0 - 替换
createProduct的默认Resolver,改为DynamoDB事务逻辑:- 条件检查
UserProductCount表中对应用户的计数值 < 100 - 同时执行两个操作:写入新的Product记录、将对应用户的计数值+1
- 只要条件检查不通过,事务就会整体失败,直接返回报错,完全避免超限问题
- 条件检查
两种方案都不会被前端绕过,所有API请求都会执行后端校验,符合安全要求。
内容的提问来源于stack exchange,提问作者good1492
相关产品推荐
相关产品推荐

