【问题标题】:Write Rules for ChildByAutoID in Firebase Realtime Database?在 Firebase 实时数据库中为 ChildByAutoID 编写规则?
【发布时间】:2020-12-28 01:33:09
【问题描述】:

JSON:

  "people" : {
    “user uid” : {
      “**Domain** : "aol.com",
      "peopleWhoLike: {
        "-M-vZavBdcpX3SzkvgKN" : "**IrrBgFY9C1ekMmHUkQRzc5LhbDu1**", ////this is autokey: uid of the likeR///
    }
  }

假设您要评估 IrrBgFY9C1ekMmHUkQRzc5LhbDu1。如果他没有通过 childByAutoID 进行,我会使用这个:

,"peopleWhoLike" : {
"$peopleWhoLike_id": {
    ".read": "auth.uid != null",
    ".write": "$peopleWhoLike_id == auth.uid && data.parent().parent().child('domain').val() == data.parent().parent().parent().child(newData.val()).child('domain').val()"
} /////checks domain of like with domain of person he likes, and makes sure only he can write for himself.

如果 IrrBgFY9C1ekMmHUkQRzc5LhbDu1 没有 ChildByAutoID,这会很好,但事实并非如此。所以现在我想我需要使用 $ChildByAutoID 之类的东西,但我不知道该怎么称呼它,因为它没有在 JSON 中明确定义。

我为 $ 变量阅读的安全规则来源:https://firebase.google.com/docs/database/security/rules-conditions

【问题讨论】:

    标签: json firebase-realtime-database firebase-authentication firebase-security


    【解决方案1】:

    我正在添加另一个专门解决问题规则部分的答案

    目标是仅当该节点中的域与当前用户域节点匹配时才允许对该节点进行写入。我不会写所有的规则,但这将是第一步:

    结构是

    people
       uid_0
          domain: "aol.com"
       uid_1
          domain: "gmail.com"
    users
       uid_2
          domain: "aol.com"
       uid_3
          domain: "aol.com"
    

    规则类似于

    {
      "rules": {
        ".read": false,
          ".write": false,
            "people": {
              "$uid": {
                ".read": "auth != null",
                ".write": "root.child('people').child($uid).child('domain').val() === 
                           root.child('users').child(auth.uid).child('domain').val()" 
              }
            }
      }
    }
    

    如果值为 /people/uid_x/domain = /users/this_uid/domain

    通过上述结构,用户 uid_2 和 uid_3 可以写到 people/uid_0 但不能写到 people/uid_1

    【讨论】:

    • 谢谢。我的结构只有人没有用户,所以我在规则中改变了它,但它工作得很好。
    【解决方案2】:

    在这个用例中,没有理由在 peoplWhoLikeMe 中使用 childByAutoId,这进一步使规则复杂化。

    您知道要存储的特定数据,因此只需将该数据与值的占位符一起存储即可。

    换句话说,我假设您正在存储用户 UID,因此您的结构将是

    people
       this_users_uid
          domain: "aol.com"
          people_who_like_me
              uid_0: true
              uid_3: true
    

    这极大地简化了规则,因为当另一个用户写入 people_who_like_me 节点时,只需验证正在写入的密钥是他们自己的 uid。它还保证了唯一性,因此子节点永远不会重复。

    【讨论】:

    • 感谢您的回答。唯一的问题是在某些情况下(例如第二天)允许重复点赞,因此如果 uid_0 在两天内点赞了两次,这两个条目将无法相互区分
    • @franktimmon 所以一个用户可以喜欢另一个用户 1000 次?这似乎很奇怪。
    • 是的,但这必须在大约 3 年的时间内发生。在上下文中这是有道理的,但是我知道这不是常态
    • @franktimmon 那么您要执行哪些规则?由于用户可以向节点写入无限数据,您要寻找什么规则?
    • 我想确保用户是当前用户,并且他的其他孩子之一(域)与他正在写入的用户的域孩子匹配
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2022-11-11
    • 2021-01-31
    相关资源
    最近更新 更多