Firestore安全规则验证:确保写入时counter递增且允许首次创建
Firestore安全规则问题分析与修正
你的规则逻辑方向是对的,但存在几个关键问题,会导致功能不符合预期甚至报错:
现有规则的问题
write操作范围混淆:Firestore的write包含create、update、delete三类操作,你单独定义了allow create,但allow write依然会覆盖部分场景。更关键的是,当执行create时,resource.data(文档现有数据)不存在,resource.data.counter会直接触发规则报错。- 未处理删除操作:如果不需要允许删除文档,当前规则没有限制,可能导致误删。
userId变量需确认定义:规则里的userId必须提前正确定义(比如从文档路径参数或请求数据中获取),否则规则会失效。
修正后的规则
// 首次创建文档:仅验证身份和timestamp,counter无递增要求 allow create: if request.auth != null && request.auth.uid == userId && request.resource.data.timestamp == request.time; // 更新文档:必须满足counter递增,同时验证身份和timestamp allow update: if request.auth != null && request.auth.uid == userId && request.resource.data.timestamp == request.time && request.resource.data.counter > resource.data.counter; // 禁止删除操作(若业务允许删除,可替换为对应验证条件) allow delete: if false;
关键说明
- 拆分
create和update操作,避免创建时访问不存在的resource.data导致的错误 - 明确限制
delete操作,根据实际业务需求调整规则逻辑 - 确保
userId变量已正确绑定(比如你的文档路径是users/{userId}/docs/{docId},则可以定义let userId = request.auth.uid;或者let userId = path.params.userId;,需匹配你的数据结构)
内容的提问来源于stack exchange,提问作者Fifi
相关产品推荐
相关产品推荐

