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

时间:2019-02-12 01:17:50

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

管理员可以管理多个论坛,用户可以是多个论坛的成员。如果发现管理员是该用户所属论坛的管理员,则该管理员应有权read该用户的个人资料数据。该安全规则必须能够比较两张地图,以查看它们是否具有相同的forumID,

// WARNING: INVALID CODE

"accounts": {
  ".read": "auth.token.permissions.fundIDsAdminMap.doAnyKeysMatch(resource.data.fundIDsMemberMap) === true"
}

不幸的是,比较两个映射需要特殊的内置函数(如上例所示),循环或递归,我认为目前在firebase规则中都不存在。

对此建模的最佳方法是什么?

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

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

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

此问题在于,它使方程的write端增加了很多复杂性。每次管理员更改时,都必须写很多散布在各处的文档以反映更改。同样,必须将大量的冗余数据存储在更多不同的对象中。此外,数据库将必须在权限管理中扮演更大的角色(由于必须存储所有这些accountID),而不是将其主要与安全规则隔离开来。最后,根本无法使用“角色”范例来组织权限是很奇怪的。没有这么多缺点的聪明解决方案吗?

1 个答案:

答案 0 :(得分:0)

似乎可以在Firestore规则中区分地图:https://firebase.google.com/docs/reference/rules/rules.MapDiff

但是,尽管您的帖子标题为Firestore,但您给出的示例规则看起来像RTDB规则,所以请弄清楚您要询问的规则。