首页 > 解决方案 > firestore 规则模拟器失败 - 可能的布尔短路问题

问题描述

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

这是横幅:

在此处输入图像描述

模拟器输入:

这是一个简短的规则来源:

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。

结果 出现红色横幅上方。

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

尝试过的事情

对此的任何帮助将不胜感激。

谢谢!

标签: firebasegoogle-cloud-firestorefirebase-consolefirebase-security

解决方案


推荐阅读