我正在使用 Firebase 实时数据库。而且我有一个结构可以防止许多孩子。我有2把钥匙。一个用于 max(max_people),另一个用于包含有多少孩子 (registered_people)。
我的结构:
我有 max_people 键。这是可以在已批准密钥中的最大子项。Registered_people 正在计算批准的密钥中有多少孩子。
这是我的安全规则:
"registrations": {
"approved": {
".write": "(root.child('/agenda/activitys').child($room_id).child('max_people').val() > root.child('/agenda/activitys').child($room_id).child('registered_people').val())"
}
我在我的 firebase 规则中所做的是检查是否有很多行。如果有太多我阻止写作。这按预期工作。
但是现在的问题是,max_people 是例如 20,并且registered_people 也是 20。不会发生写操作。因为我已经声明了。但是我怎么能允许删除比。因为我每时每刻都想删除。
所以简而言之,无论如何我都想删除。我想用我目前的规则写作。
更多信息:
我使用以下代码向键添加数据:
let data = [
"full_name": "test",
"email_addres": "test",
]
Database.database().reference().child("agenda/activitys/" + event + "/registrations/approved").child(Auth.auth().currentUser!.uid).setValue(data) { (error, ref) in
print("got from subscribing \(String(describing: error))")
if((error) != nil){
completionHandler(Result.failure(ApiError.noMorePlaces))
return
} else {
completionHandler(Result.success("succes \(event)"))
return
}
}
添加按预期工作。
我使用以下代码删除数据:
Database.database().reference().child("agenda/activitys/" + event + "/registrations/approved").child(Auth.auth().currentUser!.uid).removeValue { (error, ref) in
if((error) != nil){
completionHandler(Result.failure(ApiError.unknownError))
return
} else {
completionHandler(Result.success("succes \(event)"))
return
}
}
删除没有按预期工作。例如,当最多有 20 个密钥时,我会收到一个 permission_denied 错误。并且该最大值已被完全使用(因此我有 20 个密钥,其中包含已批准子项下的数据)。
错误:
[Firebase/Database][I-RDB038012] setValue: or removeValue: at /agenda/activitys/Jumping Fitness/registrations/approved/exCnADF43AdFUzGsi0GllEsZJZY2 failed: permission_denied
但是,当键的数量少于最大数量时,删除会起作用。
编辑:我已经在 firebase 规则模拟器上测试了建议的解决方案。我也在那里得到了模拟写入错误。
我想我有解决办法。我删除了密钥,所以我也需要密钥的规则。我的解决方案:
"registrations": {
"approved": {
".write": "(root.child('/agenda/activitys').child($room_id).child('max_people').val() > root.child('/agenda/activitys').child($room_id).child('registered_people').val())",
"$key" : {
".write" : "!newData.exists()"
}
}
当数据被删除时,该newData
变量将为空。因此,您可以使用以下exists()
方法检查它是否存在:
"registrations": {
"approved": {
".write": "(root.child('/agenda/activitys').child($room_id).child('max_people').val() > root.child('/agenda/activitys').child($room_id).child('registered_people').val()) || !newData.exists()"
}
更新:查看您提供的代码后,我可以看到您对子键进行了写入操作。但请记住,根据文档:
较浅的安全规则会覆盖较深路径的规则。
这意味着“已批准”下的写入规则将覆盖“$key”处的写入规则。所以你应该加入这两个规则并将它们保留在“$key”规则下。像这样:
"registrations": {
"approved": {
"$key" : {
".write" : "(root.child('/agenda/activitys').child($room_id).child('max_people').val() > root.child('/agenda/activitys').child($room_id).child('registered_people').val()) || !newData.exists()"
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句