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查询来尝试定位具有特定字段的现有文档,如果我没有找到任何内容,那么我就创建文档。但是,如果我确实找到了一个现有的文档,我想确保用户拥有这样做所需的权限。嗨,道格,谢谢你的回复,我应该能够通过云功能解决这个问题。