管理员可以管理多个论坛,用户可以是多个论坛的成员。如果发现管理员是该用户所属论坛的管理员,则该管理员应有权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),而不是将其主要与安全规则隔离开来。最后,根本无法使用“角色”范例来组织权限是很奇怪的。没有这么多缺点的聪明解决方案吗?
答案 0 :(得分:0)
似乎可以在Firestore规则中区分地图:https://firebase.google.com/docs/reference/rules/rules.MapDiff
但是,尽管您的帖子标题为Firestore,但您给出的示例规则看起来像RTDB规则,所以请弄清楚您要询问的规则。