firestore只允许写入一个字段

时间:2018-08-29 15:04:54

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

我在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'。

感谢在正确方向上的任何提示。

1 个答案:

答案 0 :(得分:0)

由于不确定数据库的实际内容,因此无法重现整个场景。但是,我怀疑的问题是它没有授予权限,因为request.resource.data代表整个文档的新版本(将在批准更新后存储)。 / p>

您可能想使用request.writeFields doc

请记住,request.writeFields在模拟器中不可用。