Google cloud firestore 将两个地图与Firestore安全规则(多对多安全规则)进行比较?

Google cloud firestore 将两个地图与Firestore安全规则(多对多安全规则)进行比较?,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,管理员可以管理许多论坛,用户可以是许多论坛的成员。如果发现某个管理员是某个用户所属论坛的管理员,则该管理员应有权读取该用户的个人资料数据。安全规则必须能够比较两个地图,看看它们是否有一个共同的forumID,大致如下: // WARNING: INVALID CODE "accounts": { ".read": "auth.token.permissions.fundIDsAdminMap.doAnyKeysMatch(resource.data.fundIDsMemberMap) ==

管理员可以管理许多论坛,用户可以是许多论坛的成员。如果发现某个管理员是某个用户所属论坛的管理员,则该管理员应有权
读取该用户的个人资料数据。安全规则必须能够比较两个地图,看看它们是否有一个共同的forumID,大致如下:

// WARNING: INVALID CODE

"accounts": {
  ".read": "auth.token.permissions.fundIDsAdminMap.doAnyKeysMatch(resource.data.fundIDsMemberMap) === true"
}
不幸的是,比较两个映射需要特殊的内置函数(如上面的示例所示)、循环或递归,我认为目前firebase规则中不存在这些函数

对此进行建模的最佳方式是什么

一种解决方案是放弃“fundAdmin”等角色,而是直接记录可以在对象本身上管理特定对象的
accountId
。这样就可以针对登录用户的uid执行安全性:

resource.data.administeredBy[request.auth.uid] == true

// doc would have administeredBy property
account.administeredBy= {
  accountID1: true,
  accountID5: true
};

问题是,这会给等式的
写入
端增加很多复杂性。每次管理员更改时,都必须编写分散在各地的许多单独文档来反映更改。此外,大量冗余数据必须存储在更多不同的对象中。此外,数据库必须在权限管理中发挥更大的作用(因为必须存储所有这些AccountID),而不是将其与安全规则隔离开来。最后,不能使用“角色”范例来组织权限是很奇怪的。任何没有那么多缺点的聪明解决方案?

看起来地图在firestore规则中是不同的:


然而,尽管您的帖子标题是Firestore,但您给出的示例规则看起来像RTDB规则,因此请澄清您询问的内容。

将所有管理员放入已知文档的数组字段中进行检查,或使用Firebase Auth自定义声明授予访问权限。嘿,将所有管理员放在一个已知文档的数组字段中,我相信会导致问题底部描述的相同问题。事实上,我确实在真实环境中使用了auth声明。我有一个地图,允许帐户管理员访问各种论坛,如:request.auth.permissions.fundAdmin[resource.data.fundaid]==true。但这也造成了同样的问题,即必须比较地图。因为我们看不到您用于访问文档的代码,所以我们无法判断您的操作是否正确。如果您建议用户数据已经在要修改的文档中,那么您应该说明该文档的内容,这样我们就可以看到发生了什么。