我在Firestore中设置了以下安全规则:
match /ads/{adId} {
allow read: if true;
allow write: if (request.auth.uid == request.resource.data.ownerId) ||
(request.auth != null &&
request.resource.data.size() == 1 &&
request.resource.data.keys().hasAll(['markedFavoriteBy']));
}
文档的所有者拥有所有写权限,但其他用户只能在一个字段中写-称为“ markedFavoriteBy”。它似乎可以在Firestore模拟器中工作,但不能在Xcode(与iPhone模拟器一起)中工作。 重要的是要注意,该路径不会下到文档字段-只是到文档。我知道不可能将安全规则附加到单个字段。但是,通过这种解决方法,它仍然可以正常工作。
用于更新该字段的iOS客户端代码如下:
let adRef = Firestore.firestore().collection("ads").document(ad.key!)
let value: FieldValue = ad.isFavorite ? FieldValue.arrayUnion([uid]) : FieldValue.arrayRemove([uid])
adRef.updateData([DatabaseKeys.markedFavoriteBy : value]) { (error) in
if let error = error {
print(error.localizedDescription)
}
}
打印到控制台的错误当然是:“缺少权限或权限不足。”
我在代码中找不到错误-这是与iOS Firestore SDK更新有关的错误吗?仅在该最新更新中添加了arrayUnion和arrayRemove函数。
完整性检查:我已将写入规则更改为 允许写入:如果为true; 结果:可以毫无问题地更改数组'markedFavoriteBy'。
感谢在正确方向上的任何提示。
答案 0 :(得分:0)
由于不确定数据库的实际内容,因此无法重现整个场景。但是,我怀疑的问题是它没有授予权限,因为request.resource.data
代表整个文档的新版本(将在批准更新后存储)。 / p>
您可能想使用request.writeFields
doc
请记住,request.writeFields
在模拟器中不可用。