允许使用 Firebase 规则进行删除和写入

da1lbi3

我正在使用 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Firebase数据库规则中允许写入和允许创建更新之间的区别

来自分类Dev

如何配置Firebase安全规则以仅允许从CURL / PHP源进行写入?

来自分类Dev

如何使用Firebase安全规则仅允许写入1个值

来自分类Dev

Firebase 规则允许读取但不允许写入

来自分类Dev

Firebase 数据库规则模拟器允许未经身份验证的用户读取和写入

来自分类Dev

Firebase规则:使用父值进行验证?

来自分类Dev

无法使用规则写入 Firebase 数据库

来自分类Dev

firebase安全规则仅允许对文档的某些特定字段/属性进行写权限

来自分类常见问题

Firebase存储和允许访问控制的来源

来自分类Dev

允许字段,但没有义务在firebase规则和验证中

来自分类Dev

使用XSLT允许和删除元素

来自分类Dev

使用 firebase 对 recyclerview 进行排序和显示

来自分类Dev

Firebase规则:仅在满足资源属性条件时允许只读

来自分类Dev

使用Firebase模拟删除

来自分类Dev

使用Java删除Firebase

来自分类Dev

使用Firebase进行Foreach

来自分类Dev

Firebase仅允许已登录用户写入

来自分类Dev

在firebase规则中使用contains()

来自分类Dev

使用 Firebase 配置 Proguard 规则

来自分类Dev

Firebase安全和规则,如何让用户删除自己的数据?

来自分类Dev

为什么我的Firebase Firestore安全规则允许对现有文档进行.set()操作,但是.set()缺少字段

来自分类Dev

为什么我的Firebase Firestore安全规则允许对现有文档进行.set()操作,但是.set()缺少字段

来自分类Dev

为什么我可以使用这些Firebase数据库规则写入`/ users`?

来自分类Dev

为什么我可以使用这些Firebase数据库规则写入`/ users`?

来自分类Dev

如何设置EC2安全组以允许使用Firebase?

来自分类Dev

如何设置EC2安全组以允许使用Firebase?

来自分类Dev

Firebase 查询不允许对多个属性进行排序?

来自分类Dev

firebase 规则为 auth 用户写入但只删除它自己的数据

来自分类Dev

用户和朋友使用Firebase(AngularFire)进行设计和实现

Related 相关文章

  1. 1

    Firebase数据库规则中允许写入和允许创建更新之间的区别

  2. 2

    如何配置Firebase安全规则以仅允许从CURL / PHP源进行写入?

  3. 3

    如何使用Firebase安全规则仅允许写入1个值

  4. 4

    Firebase 规则允许读取但不允许写入

  5. 5

    Firebase 数据库规则模拟器允许未经身份验证的用户读取和写入

  6. 6

    Firebase规则:使用父值进行验证?

  7. 7

    无法使用规则写入 Firebase 数据库

  8. 8

    firebase安全规则仅允许对文档的某些特定字段/属性进行写权限

  9. 9

    Firebase存储和允许访问控制的来源

  10. 10

    允许字段,但没有义务在firebase规则和验证中

  11. 11

    使用XSLT允许和删除元素

  12. 12

    使用 firebase 对 recyclerview 进行排序和显示

  13. 13

    Firebase规则:仅在满足资源属性条件时允许只读

  14. 14

    使用Firebase模拟删除

  15. 15

    使用Java删除Firebase

  16. 16

    使用Firebase进行Foreach

  17. 17

    Firebase仅允许已登录用户写入

  18. 18

    在firebase规则中使用contains()

  19. 19

    使用 Firebase 配置 Proguard 规则

  20. 20

    Firebase安全和规则,如何让用户删除自己的数据?

  21. 21

    为什么我的Firebase Firestore安全规则允许对现有文档进行.set()操作,但是.set()缺少字段

  22. 22

    为什么我的Firebase Firestore安全规则允许对现有文档进行.set()操作,但是.set()缺少字段

  23. 23

    为什么我可以使用这些Firebase数据库规则写入`/ users`?

  24. 24

    为什么我可以使用这些Firebase数据库规则写入`/ users`?

  25. 25

    如何设置EC2安全组以允许使用Firebase?

  26. 26

    如何设置EC2安全组以允许使用Firebase?

  27. 27

    Firebase 查询不允许对多个属性进行排序?

  28. 28

    firebase 规则为 auth 用户写入但只删除它自己的数据

  29. 29

    用户和朋友使用Firebase(AngularFire)进行设计和实现

热门标签

归档