我的文档中有一个“所有者”字段,仅使所有者有权阅读该文档,并且只能编写一个新的文档,其“所有者”字段是用户的uid:
allow read: if request.auth.uid == resource.data.owner;
allow create, write : if request.auth.uid == request.resource.data.owner;
创建和更新规则按预期工作!我进行了测试,发现如果新数据中记录的“所有者”字段不是用户的UID,那么它将不起作用!
问题是“读取”部分。我无法读取记录。仅当我更改为allow read: request.auth.uid != null
时,我才能阅读。
我在调试中三重检查了记录是否具有与UID完全相同的“所有者”字段。
我有使用Firebase的经验,我不知道这里出了什么问题。
答案 0 :(得分:1)
由于您指出“ [您无法读取记录 s ””(记录中带有 S ),因此您的问题很可能是由于以下事实如documentation所述,安全规则不是过滤器:
一旦保护好数据并开始编写查询,请记住 安全规则不是过滤器。 您不能为所有内容写查询 集合中的文档,并期望Cloud Firestore返回 仅当前客户有权访问的文档。
您没有显示用于读取Firestore文档的查询,但让我们假设您的文档在名为collection
的集合中。
带有类似查询
query = db.collection("collection")
query.get().then(....);
您要独立于用户ID查询,因此出现了问题。
您需要使用where()
方法调整查询,如下所示:
//get the value of uid
query = db.collection("cities").where("owner", "==", uid)
query.get().then(....)