首页 > 解决方案 > Firebase Firestore 安全规则:在创建规则中触摸 resource.data 始终返回 false

问题描述

我试图了解resource.dataFirestore 的安全规则,因为它在规则中有一些特殊性create。以下返回错误:

allow create: if ('foo' in resource.data) || !('foo' in resource.data);

我相信这是因为resource.data在创建操作中不存在,因为以下 2 个语句解析为 true:

allow create: if ('foo' in request.resource.data) || !('foo' in request.resource.data);
allow update: if ('foo' in resource.data) || !('foo' in resource.data);

即使这失败了:

allow create: if debug(resource.data.size()) == 0;

现在您可能想知道为什么我需要涉及resource.data创建规则。这是因为我正在使用双重职责write规则而不是create规则,并且任何时候resource.data被触及,我都会得到意想不到的结果。我正在尝试了解如何检测规则create内的操作write并应用适当的逻辑。有什么办法可以做到这一点?

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


事实证明,if ('foo' in resource.data) || !('foo' in resource.data);不评估为真的原因是因为resource.data在创建时默默地抛出异常,它迫使整个事情评估为假。检查规则是否由规则触发createupdate在规则中触发的write方法很简单:

resource == null // if true, it's create, otherwise, it's update

2022-01-22 更新:

有一种更语义化的方式来确定操作是否是创建:

request.method == 'create'

文档:https ://firebase.google.com/docs/rules/rules-language#building_conditions


推荐阅读