我正在尝试编写仅允许添加某种类型的值的安全规则。
这就是我现在拥有的:
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',
}
为什么规则不接受值的添加而仅接受已经存在的值的更新?
答案 0 :(得分:1)
请记住,在更新成功之后, docker container stop $(docker container ls -a -q) && docker system prune -a -f --volumes
始终包含文档中的所有所有字段。这包括文档中所有现有的字段。
情况的更新之所以有用,是因为文档的新内容满足所有条件。
第二种情况下的更新无法正常进行,因为它无法对文档中不存在的字段进行所有检查,并且也未在更新中提供这些字段。如果您希望第二种情况有效,则必须对规则进行编码,以使像现在这样的特定类型实际上不需要缺少字段。