Javascript Firestore规则-查询文档是否存在-权限不足

Javascript Firestore规则-查询文档是否存在-权限不足,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,我想查询文档引用以查看文档当前是否存在。如果它不存在,那么我想为该引用编写一个新文档 不幸的是,这不符合我的安全规则。如果文件已经存在,那么我只希望授权人员能够查看它。我的规则是这样的 消防队规则 function getItemData(item){ return get(/databases/$(database)/documents/equipment/$(item)).data; } function getUserData(){ return get(/databases

我想查询文档引用以查看文档当前是否存在。如果它不存在,那么我想为该引用编写一个新文档

不幸的是,这不符合我的安全规则。如果文件已经存在,那么我只希望授权人员能够查看它。我的规则是这样的

消防队规则

function getItemData(item){
   return get(/databases/$(database)/documents/equipment/$(item)).data;
}

function getUserData(){
   return get(/databases/$(database)/documents/users/$(request.auth.uid)).data;
}

match /equipment/{item}{
   allow create: if request.auth != null;
   allow read: if !exists(/databases/$(database)/documents/equipment/$(item)) ||
               getUserData().clientId == getItemData(item).clientId;
}
文件结构

users > userId: {
  clientId: "idhere"
}

equipment > item: {
  clientId: "idhere",
  serial: "serialnumber"
}
执行get请求的react本机代码

const docRef = firestore.collection("equipment").where('clientId', '==', clientId).where("serial", "==", serial);
docRef.get().then(doc => {
  if(!doc.exists){
    //add new item to existing document reference
  }
}).catch(error => {
  //Error here reads "Missing or insufficient persmissions"
})
如果我直接查询,我可以阅读项目。但是,我的where()函数似乎与规则冲突

有人知道为什么会这样吗

编辑:如果我将规则更改为此

match /equipment/{item}
   allow read: if true

我正在寻找成功,所以我肯定是这个规则导致了我的问题。使用模拟器时,我可以直接访问文档。似乎where语句是问题所在

如果您不希望用户能够阅读现有文档,则不应授予他们阅读权限。这意味着他们也无法通过读取文档来检测文档的存在

但是,如果文档还不存在,您可能仍然可以通过仅允许用户
创建
权限来访问您的用例:

allow create: if request.auth != null && !exists(resource['__name__']) 

现在,您可以让客户机简单地尝试创建文档。如果失败,您就知道该文档已经存在(或者不符合其他安全规则)。

对于结果集中的每个文档,如果其他文档的内容表明它应该是可读的,您似乎希望该规则进行检查。查询失败,因为。请务必理解此处的文档。您不能编写从请求的结果集中删除文档的规则-查询必须是全部或无


该规则适用于document get()请求,因为请求的文档提前知道-
{item}
具有特定值。但是在查询的情况下,规则不能单独检查每个可能的文档。您需要找到另一种方式来表达您的意图。

看来您真的没有为您试图读取的目录设置规则。您的规则是
/equipment/{item}
,而您的查询是针对
/equipment
。试着加上这一行<代码>匹配/设备/{允许读取:如果为真;}。如果这样做有效,那么您可以对规则进行微调,以添加适当的权限shi S.Ramjit。不幸的是,这不起作用。我相信规则路径必须在文档级别。嗨,Frank,谢谢你的回复。我遇到的问题是,我使用where查询来尝试定位具有特定字段的现有文档,如果我没有找到任何内容,那么我就创建文档。但是,如果我确实找到了一个现有的文档,我想确保用户拥有这样做所需的权限。嗨,道格,谢谢你的回复,我应该能够通过云功能解决这个问题。