[英]Array comparison in Firestore security rules
用户需要能够将他们的 uid 添加到文档中称为“用户”的数组中。 他们应该只能添加/删除他们的 uid,而不是别的。
我需要编写一个安全规则来允许这样做,但无法弄清楚如何在安全规则中进行数组比较。
它需要是这样的:
allow update: if request.resource.data.users == [...resource.data.users, request.auth.uid]
这是查询:
.update({
users: firebase.firestore.FieldValue.arrayUnion(params.uid),
})
这可能吗?
是的,这是可能的,:
allow update: if request.auth != null
&& request.auth.uid in request.resource.data.users
&& request.resource.data.users.size() - resource.data.users.size() == 1
request.resource.data.users 是提议更改之后用户文档的状态,而 resource.data.users 是提议更改之前文档的状态。 通过检查差值是否为 1,您可以保证只有一项被添加到数组中。
是的。 可以检查安全规则中文档的数组字段中是否存在特定的uid
。 您可以使用in
条件来检查相同的内容。
所以它看起来很像这样。
allow update: if (request.auth.uid in request.resource.data.users);
希望这可以帮助。
arrays 上有一个removeAll
方法用于数组排除。 看到这个答案
这里有一点 function 检查两个 arrays 是否因提供的元素而完全不同。
function arrDifferBy(arr1, arr2, el) {
let diff12 = arr1.removeAll(arr2);
let diff21 = arr2.removeAll(arr1);
return diff12.length == 1 && diff21.length == 0 && diff12[0] == el ||
diff12.length == 0 && diff21.length == 1 && diff21[0] == el
}
在您的情况下,它将像
allow update: if arrDifferBy(request.resource.data.users, resource.data.users, request.auth.uid)
编辑:经过几个小时的与类似任务的斗争,我决定在云 function 中进行。 如果这取决于其他文档的创建,或者您可以使用可调用的云函数,那么麻烦会少得多。
我写这个,我认为它对arrayUnion
是安全的,它用于添加auth.uid
但你可以为你的目标转换代码
function isOwnerUnionedInArray(arrayName) {
let isCreating = resource == null;
let resourceArray = resource.data.get(arrayName, []);
let requestArray = request.resource.data[arrayName];
let arrayDiff = requestArray.removeAll(resourceArray);
return ((
isCreating &&
requestArray.size() == 1
) || (
requestArray.size() == resourceArray.size() &&
arrayDiff.size() == 0
) || (
requestArray.size() == resourceArray.size() + 1 &&
arrayDiff[0] == request.auth.uid
)
) && request.auth.uid in requestArray;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.