【问题标题】:Firestore security rules: update document security ruleFirestore 安全规则:更新文档安全规则
【发布时间】:2020-06-19 23:45:41
【问题描述】:

我正在尝试编写一个只允许添加某种类型的值的安全规则。

这就是我现在拥有的:

allow update if 
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.sessionID == key2
    // THIS CHECKS IF THE USER IS ALLOWED TO UPDATE THIS DOCUMENT

    && request.resource.data.description is string
    && request.resource.data.endMo is number

    && request.resource.data.startMo is number

    && request.resource.data.openMO is bool

    && request.resource.data.pdf is string

    && request.resource.data.Adress == resource.data.Adress //USER can't update this field

    && request.resource.data.size() <= 40; 

如果所有字段都已填写,则此方法有效。

情况 1 -> 有效

原始文档

{
'description': 'helloworld',
'endMo': 12,
'startMo': 6,
'openMo': true,
'pdf': 'url',
'adress': 'myAdress',
}

 db.collection("myCol").doc("myDoc").update({  
    'description': 'helloworld2',
    }

情况 2 -> 不起作用

原始文档

   {
    'adress': 'myAdress',
    }

  db.collection("myCol").doc("myDoc").update({  
    'description': 'helloWorld',
    }

为什么规则不接受添加值而只接受更新已经存在的值?

【问题讨论】:

  • 请编辑问题以显示被规则拒绝的确切代码。规则本身是没有意义的,没有它们旨在允许的特定查询。考虑到问题中的所有细节,我们应该能够重现这种情况。
  • 正如@DougStevenson 提到的,请添加它旨在允许的查询。只是一个猜测:您是否在情况 2 中使用“点符号”?如果没有,您应该... firebase.google.com/docs/firestore/manage-data/…

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


【解决方案1】:

请记住,request.resource.data 在更新成功后始终包含文档中的所有字段。这包括文档中的所有现有字段。

情况更新有效,因为文档的新内容满足所有条件。

第二种情况下的更新不起作用,因为它未通过对文档中尚不存在且更新中未提供的字段的所有检查。如果您希望第二种情况起作用,您将不得不对规则进行编码,以便像现在这样的特定类型实际上不需要缺少的字段。

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 2018-10-19
    • 2019-07-05
    • 2019-01-15
    • 2018-03-27
    • 2019-03-03
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多