firestore规则模拟器失败-可能存在布尔短路问题

时间:2018-07-31 12:11:31

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

问题:当我尝试在a集合中创建对象时,Firestore规则模拟器在顶部显示红色的失败横幅。

这是横幅:

enter image description here

模拟器输入:

  • 类型:create
  • 路径:/z/zid0/a/aid0
  • 我设置了一些文档内容
  • 已认证:check
  • 提供者:google
  • AuthId:aid0
  • 已验证电子邮件:yes

以下是缩写的规则来源:

service cloud.firestore {
    match /databases/{database}/documents {

        match /z/{zId} {
          function isWriteAllowedCurrentZ() {
              return getUserDataForCurrentZ().keys().hasAll(['write'])
          }

          function getUserDataForCurrentZ() {
              return get(/databases/$(database)/documents/z/$(zId)/a/$(request.auth.uid)).data;
          }

          function zExists() {
              return exists(/databases/$(database)/documents/z/$(zId))
          }

          function isCreateA_Allowed() {
              return !zExists() || isWriteAllowedCurrentZ()
          }

          match /a/{document=**} {
              allow create: if isCreateA_Allowed();
          }
    }
}

期望 因为zid0不存在,所以我期望/z/zid0/a/aid0的创建会成功,因为isCreateA_Allowed()-> !zExists()将返回true。

结果 出现红色横幅上方。

当前流量 我怀疑Firestore规则评估程序没有使布尔逻辑短路。即使IsWriteAllowedCurrentZ()是真实的并且与它进行“或”运算,它最终仍会调用!zExists()IsWriteAllowedCurrentZ()将尝试访问不存在的对象并失败(不返回false,但失败),这会以错误的形式冒出模拟器。我已经能够模拟有效的拒绝,并且与成功类似,在做出决定的规则旁边会出现一个红色的“ x”标记。与上面看到的红色横幅相比,这是完全不同的视觉效果。

尝试过的事情

  • 尝试使isCreateA_Allowed仅检查!zExists()。可行(我得到一个绿色的复选标记)

    function isCreateA_Allowed() {
        return !zExists() // || isWriteAllowedCurrentZ()
    }
    
  • 尝试将isWriteAllowedCurrentZ更改为始终返回false。可行(我得到一个绿色的复选标记)

      function isWriteAllowedCurrentZ() {
          return false // getUserPermsDataForCurrentZ().keys().hasAll(['write'])
      }
    
  • 试图在调用getUserDataForCurrentZ()之前进行是否存在检查,但这不起作用。它会生成相同的红色横幅。

      function isWriteAllowedCurrentZ() {
          return doesUserDataExist() && getUserDataForCurrentZ().keys().hasAll(['write'])
      }
    

任何帮助,将不胜感激。

谢谢!

0 个答案:

没有答案