【问题标题】:Unable to use the logical OR operator in Firebase Firestore security rules - the condition always evaluates to `false`无法在 Firebase Firestore 安全规则中使用逻辑 OR 运算符 - 条件始终评估为“假”
【发布时间】:2018-09-28 10:44:04
【问题描述】:

如果登录用户是经理记录不存在,我想允许写入/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();

即使!companyExists(company) 函数的计算结果为true,此条件的计算结果始终为false

我确信 companyExists(company)isManager() 函数可以按预期工作,因为我一直在单独测试它们。

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

allow write: if !companyExists(company);

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

【问题讨论】:

  • 您的前端代码结构如何?我遇到了类似的问题,解决方案是以正确的顺序初始化 firestore 绑定

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


【解决方案1】:

没用:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 确实如此,但我发布的示例过于简单。实际上,我需要检查由||运算符分隔的多个条件,因此您发布的解决方案对我没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 2016-04-14
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多