【问题标题】:Comparing resource and request resource in firestore比较firestore中的资源和请求资源
【发布时间】:2018-10-23 01:43:17
【问题描述】:

我有一个简单的 Firestore 规则:

allow update: if request.resource.data.reservedBy == resource.data.reservedBy;

我在模拟器中的payload是

{"name":"/databases/(default)/documents/books/I3dbzzwGJGXnqMQBOxoP","data":{"reservedBy":"Ivanko"}}

方法是“更新”。 'reservedBy'字段的值与实际记录完全不同。

无论我做什么,无论我将有效负载更改为什么,规则将始终返回 true 并允许更新。这是一个错误还是我错过了什么。有趣的是,如果我将“更新”更改为“创建”,则规则按预期工作。其他人遇到过这个吗?

谢谢。

【问题讨论】:

  • 已知模拟器存在错误。这适用于实际更新吗?
  • 有意思,没测试过。我的前端反映了这条规则,所以检查起来有点棘手。我将编写几个手动测试并进行报告。

标签: firebase google-cloud-firestore firebase-security


【解决方案1】:

我一直在处理类似的问题,我发现这是罪魁祸首……摘自 (https://firebase.google.com/docs/firestore/security/rules-conditions)。 --对于只修改文档字段子集的更新操作,request.resource 变量将包含操作“之后”的“待处理”文档状态。

【讨论】:

  • 我很难理解pending document state 的含义。 request.resource.data 包含整个更新的文档还是仅包含正在更新的文档的子集?
  • 自从我的原始帖子以来,我还没有深入研究过这个,但据我了解,request.resource.data 将包含反映文档状态的整个文档(如果允许的话)。您可以对此进行测试以查看是否仅发送了一个子集。我认为您可以有一个名为 population 的字段,并在应用任何规则之前将其更新为零。然后在之后添加一条更新规则,例如“if request.resource.data.population > 0”。然后更改人口字段以外的字段。如果它不允许更新,那么您知道人口字段已发送。
【解决方案2】:

刚刚收到 Firebase 团队的答复,说这确实是一个模拟器错误,并且该规则应该在生产中起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2011-11-30
    相关资源
    最近更新 更多