无法在Firebase Firestore安全规则中使用逻辑OR运算符-条件的计算结果始终为“false”`

无法在Firebase Firestore安全规则中使用逻辑OR运算符-条件的计算结果始终为“false”`,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,如果登录用户是经理或记录不存在,我想允许写入/companys/{company} 我有以下安全规则: service cloud.firestore { match /databases/{database}/documents { function isManager() { return get(/databases/$(database)/documents/managers/$(request.auth.uid)).data.id == request.auth

如果登录用户是经理或记录不存在,我想允许写入
/companys/{company}

我有以下安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    function isManager() {
      return get(/databases/$(database)/documents/managers/$(request.auth.uid)).data.id == request.auth.uid;
    }

    function companyExists(company) {
      return exists(/databases/$(database)/documents/companies/$(company));
    }

    match /{document=**} {
      allow read, write: if false;
    }

    match /companies/{company} {
      allow read: if resource.data.isActive == true || isManager();
      allow write: if !companyExists(company) || isManager();
    }
  }
}
以下行有问题:

allow write: if !companyExists(company) || isManager();
此条件的计算结果始终为
false
,即使
!companyExists(company)
函数的计算结果为
true

我确信
companyExists(company)
isManager()
函数按预期工作,因为我已经分别对它们进行了测试

例如,如果我使用以下规则:

allow write: if !companyExists(company);

如果公司记录不存在,则表达式的计算结果为
true
。与
isManager()函数相同。如果
managers
集合中存在登录的用户ID,则返回
true
。只有在两个函数之间使用
|
运算符时,才会出现此问题。

似乎您希望允许所有人创建公司,但只允许经理编辑公司。这可以通过更简单的方式实现:

match /companies/{company} {
  allow read: if resource.data.isActive == true || isManager();
  allow create;
  allow update, delete: if isManager();
}
它也会更便宜,因为您不需要执行get请求来检查它是否存在

此外,isManager的逻辑也可以使用自定义声明而不是文档重写,这样您还可以保存另一个读取。这超出了这个问题的范围,但如果您需要更多详细信息,请发表评论。

不起作用:

allow read: if request.auth.uid != null || if request.auth.uid == "VacOqosKJhPjxQaCf93wGVjc8Fy2"
通过这种方式工作:

allow read: if request.auth.uid != null;
allow read: if request.auth.uid == "GePV7U9kDmfThLVXzks6nn2HgXn2";

这是事实,但我发布的示例过于简单。实际上,我需要检查由
|
操作符分隔的多个条件,因此您发布的解决方案对我没有帮助。您的前端代码是如何构造的?我有一个类似的问题,解决方案是以正确的顺序初始化firestore绑定