无法在Firebase Firestore安全规则中使用逻辑OR运算符-条件始终评估为“ false”

时间:2018-09-28 10:44:05

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

如果登录的用户是管理员 OR 记录不存在,我想允许写入/companies/{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()函数相同。如果true集合中存在登录用户的ID,它将返回managers。仅当在两个函数之间使用||运算符时,问题才会出现。

2 个答案:

答案 0 :(得分:0)

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

match /companies/{company} {
  allow read: if resource.data.isActive == true || isManager();
  allow create;
  allow update, delete: if isManager();
}

它也会更便宜,因为您不需要执行get请求来检查它是否存在。

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

答案 1 :(得分:0)

没有工作:

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";