Firestore安全规则:更新文档安全规则

时间:2020-03-07 12:42:32

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

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

这就是我现在拥有的:

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',
    }

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

1 个答案:

答案 0 :(得分:1)

请记住,在更新成功之后, docker container stop $(docker container ls -a -q) && docker system prune -a -f --volumes 始终包含文档中的所有所有字段。这包括文档中所有现有的字段。

情况的更新之所以有用,是因为文档的新内容满足所有条件。

第二种情况下的更新无法正常进行,因为它无法对文档中不存在的字段进行所有检查,并且也未在更新中提供这些字段。如果您希望第二种情况有效,则必须对规则进行编码,以使像现在这样的特定类型实际上不需要缺少字段。