firebase - firestore 规则模拟器失败 - 可能的布尔短路问题
问题描述
问题a
:当我尝试在集合中创建对象时,Firestore 规则模拟器在顶部给我一个红色的失败横幅。
这是横幅:
模拟器输入:
- 类型:
create
- 小路:
/z/zid0/a/aid0
- 我设置了一些文档内容
- 已认证:
check
- 提供者:
google
- 身份验证:
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。
结果 出现红色横幅上方。
Current Throughts
我怀疑 Firestore 规则评估器没有短路布尔逻辑。IsWriteAllowedCurrentZ()
即使它!zExists()
是真实的并且与它进行或运算,它 最终也会调用。IsWriteAllowedCurrentZ()
将尝试访问一个不存在的对象并失败(不返回 false,但失败),这会从模拟器中冒泡为 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']) }
对此的任何帮助将不胜感激。
谢谢!
解决方案
推荐阅读
- php - Symfony 5 中实体的关系
- c++ - 使用 cmake、mingw 的 C++ 中的 MySQL 和 MariaDB 库
- azure - 使用“Microsoft.Azure.KeyVault”SDK 的客户端代码如何设法让 Azure AD 令牌通过 Azure keyvault 进行身份验证以检索机密?
- python - 使用具有可变数量参数的函数字典 - 我可以在这里使用 partial 吗?
- node.js - 当我尝试登录时 Auth0 返回错误
- casting - 包含项目的 const-propagation
- flutter - 颤振初始化失败
- angular - Angular 导入子模块导致父模块的组件损坏
- java - 我可以将 Flux 作为 ServerResponse 正文的一个字段吗?
- php - 是否有可以在任何 PHP 网站中使用的通用身份验证模块?