我在Firestore中拥有一个数据库,该数据库具有我已通过读取,创建,更新和删除操作为其定义安全规则的集合的数量。
直到周六中午,所有具有给定条件的规则都允许将数据读写到集合中,但是之后突然在一个名为“位置”的特定集合中给出了 PERMISSION DENIED 例外,仅适用于在同一集合中创建文档,但可以读取,更新和删除作品。
所以我更改了该集合的规则,如下所示进行测试
#!/bin/bash
MAJORRELEASE=$( lsb_release -sr | cut -d\. -f1 )
STROS=$( lsb_release -si )
# Ubuntu 18.04
if [ $STROS == Ubuntu ] && [ $MAJORRELEASE -ge 18 ] ; then
if [ -d /etc/netplan ]; then
DNSSERVERS=``
DNSSERVERSSEARCH=``
cat <<EOF | tee /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
switchports:
match: {name: "enp*"}
bonds:
bond0:
interfaces: [switchports]
addresses: [${IP}]
gateway4: ${ROUTE}
nameservers:
search: [${DNSSERVERSSEARCH}]
addresses: [${DNSSERVERS}]
EOF
fi
fi
,在Android客户端中,我的编码为
match /locations/{locationID} {
allow read: if true;
allow create: if true; //Condition commented...
allow update: if <condition>;
allow delete: if false;
}
尽管如此,允许创建:如果为真,则会给出缺少权限或权限不足的相同例外。但是当我将其更改为“允许写:如果为真” 时,它将起作用并添加了文档
当我在规则和客户代码中都将集合名称更改为 test 时,它将在同一集合中创建新文档,但是当我更改时集合名称为 locationData , location 和 locations ,将无法正常工作。
这是Firestore规则中的问题吗?或者有什么解决方案?
答案 0 :(得分:0)
似乎在尝试将dataMap保存到Firestore时触发了更新规则。
请注意,doc.set()
基本上是set()
。
{{1}}的行为是,如果文档已经存在,它将尝试覆盖该文档,并将执行更新操作,从而触发您的安全规则中的更新规则。
您有两个选择:
1)检查要保存的数据是否已在locations集合中存在。
2)将更新规则设置为允许为true,以便您可以验证文档是否已存在。
希望有帮助。