在我的用例中,文档由特定组的多个用户处理。 该文档包含(除了其他条目)两个相关字段:
ownerUID
(字符串值 - 代表文档所有者的 UID)members
(字符串数组 - 表示允许处理此文档的所有成员的 UID)我想确保(使用安全规则),(除了文档的所有者)没有成员能够从 members
数组中删除另一个成员 - 除了他们自己。
为了评估这一点,我尝试在我的 Firestore Security Rules
function onlyOwnMemberUIDRemovableOrOwner(){
return request.auth.uid == resource.data.ownerUID ||
resource.data.members.toSet().difference(request.resource.data.members.toSet()) == request.auth.uid.toSet();
}
第一条语句非常明显,并且适用于我设置中的其他规则,允许 owners
无限制地修改文档:
request.auth.uid == resource.data.ownerUID
第二个语句给我带来了问题。这个想法是,通过使用 members
的 .difference()
函数评估 sets
字段中的缺失值,并将其与仅包含自己的 {{1} }.仅当缺少的 set
是自己的 UID
时,函数才应返回 UID
。不幸的是,即使尝试删除自己的 UID
,该语句仍将返回 true
。
UID
你能告诉我我在这里做错了什么吗? 您知道解决问题的更好方法吗? 非常感谢您的支持。
答案 0 :(得分:1)
您的代码有两个问题:
toSet()
适用于 list
而不适用于 string
ownerUID
未被修改这里是更正的规则:
function onlyOwnMemberUIDRemovableOrOwner(){
return request.resource.data.ownerUID == resource.data.ownerUID
&& (request.auth.uid == resource.data.ownerUID ||
resource.data.members.toSet().difference(request.resource.data.members.toSet()) == [request.auth.uid].toSet());
}