use*_*921 3 firebase firebase-security
我看了Firebase的官方指南,我得到的印象是request.resource.data指向正在写入的新数据。但是,当我在模拟器中测试时,request.resource.data无论我发送什么,都存在,并且始终等于resource.data. 我读了文档,内容有点绕。
如果这些值应该相同,我如何解释指南中的这段代码
allow create: if
request.resource.data.score is number &&
request.resource.data.score >=1 &&
request.resource.data.score <=5 &&
Run Code Online (Sandbox Code Playgroud)
据说这是为了防止用户发送无效的 1-5 星级餐厅评级。然而,根据我从模拟器中了解到的,这验证了已经存在的数据,而不是传入的数据。
链接到视频中的时刻: https://youtu.be/eW5MdE3ZcAw?t=628
在创建/更新/删除操作中,request.resource指的是操作之后存在的文档(如果操作成功),而resource指的是操作之前存在的文档。
因此(仅)如果您的写入操作没有进行任何更改,它们会完全相同。
来自数据验证文档:
该
resource变量引用所请求的文档,并且resource.data是存储在文档中的所有字段和值的映射。有关该resource变量的更多信息,请参阅参考文档。写入数据时,您可能希望将传入数据与现有数据进行比较。在这种情况下,如果您的规则集允许挂起写入,则该
request.resource变量包含文档的未来状态。对于仅修改文档字段子集的更新操作,该request.resource变量将包含操作后的挂起文档状态。您可以签入字段值request.resource以防止不需要的或不一致的数据更新:Run Code Online (Sandbox Code Playgroud)service cloud.firestore { match /databases/{database}/documents { // Make sure all cities have a positive population and // the name is not changed match /cities/{city} { allow update: if request.resource.data.population > 0 && request.resource.data.name == resource.data.name; } } }
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |