Firestore安全规则多个get()无法按预期工作

时间:2018-09-05 02:57:33

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

这些是我的firestore安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /collectionA/{someID} {
         function checkA() {
            return get(/databases/$(database)/documents/collectionA/$(someID)/users/$(request.auth.uid)).data.deleteFlag != true
         }
         function checkB() {
            return get(/databases/$(database)/documents/collectionB/$(request.auth.uid)/companies/$(someID)).data.deleteFlag != true
         }
         allow read, write: if  checkA() || checkB()
    }
  }
}

这是我的数据库对象:

project {
  collectionA {
    companyA {
      users {
        r9Myn4TfzAVpSZGzyaet {
          deleteFlag: false
        }
      }
    }
  }
  collectionB {
    aAzUlfztdYdEIXT3Tva73kCiuy93 {
      companies {
        companyA{
          deleteFlag:false
        }
      }
    }
  }
}

我尝试了Simulator:

simulation type : get
location        : collectionA/companyA
provider        : password
Firebase UID    : aAzUlfztdYdEIXT3Tva73kCiuy93

我希望此安全规则返回“ true”。 因为我认为checkA返回“ false”,而checkB返回“ true”。 但是他们返回了“ false”。

如果您有任何想法或建议,请告诉我。

1 个答案:

答案 0 :(得分:0)

我听说模拟器有时无法正常工作。 我从客户端提出查询并进行了验证,它可以正常工作。 所以我认为这是模拟器中的错误。 但是,我收到了开发人员平台支持的以下回复。

仅供参考

  

如果尝试获取一个值,get函数将得到一个错误。   不存在的对象。当条件发生错误时   判断,安全规则未应用在安全规则中。   由于安全规则的规范,不可能   控制不存在的对象