Firestore安全规则:更新时request.resource.data.<prop>的行为疑问
Firestore安全规则更新请求的校验逻辑解析
嘿,我来帮你理清楚Firestore安全规则这里的逻辑——你没贴出具体的安全规则代码,不过结合你提到的request.resource.data的疑问,我用常见的规则场景拆解下,你就能对应到自己团队的情况里了。
先搞懂核心知识点
Firestore里request.resource.data在**更新请求(比如前端用update()方法)**中的表现很关键,很多人容易搞混:
- 它存储的是更新完成后文档的完整数据——也就是原文档里已有的所有字段,加上你这次请求提交的更新字段(如果有重复就覆盖原字段)。
- 绝对不是只包含你这次请求里传的那几个字段!这是最容易踩的坑。
用实际例子看结果
假设你的安全规则是这样的(很常见的必填字段校验):
match /categories/{categoryId} { allow update: if request.resource.data.keys().hasAll(['name', 'status']); }
现在前端发起更新请求,只传了name: "前端框架分类",没传status字段(原文档里这个字段本来就存在,比如是active)。
预期结果:校验通过
因为request.resource.data里会包含原文档的status字段,加上你新传的name字段,所以keys().hasAll(['name', 'status'])这个条件是完全满足的。
反例:如果规则要求必须显式提交字段
要是你的规则是检查request.data(仅本次请求提交的字段):
match /categories/{categoryId} { allow update: if request.data.keys().hasAll(['name', 'status']); }
那只传name的更新请求就会失败,因为request.data里只有你这次提交的name,没有status。
快速判断方法
要确定你的规则会通过还是失败,抓两个关键点:
- 规则里用的是
request.resource.data(最终完整文档)还是request.data(仅本次提交的字段) - 原文档里是否存在规则要求的、但这次请求没提交的字段
如果是用request.resource.data且原文档有那些缺失的必填字段,更新请求就能过;如果规则要求必须提交某些字段(用request.data检查),没提交就会失败。
内容的提问来源于stack exchange,提问作者DauleDK
相关产品推荐
相关产品推荐

