【问题标题】:Firebase realtime rules how to check if node with AutoID contains correct dataFirebase 实时规则如何检查具有 AutoID 的节点是否包含正确的数据
【发布时间】:2019-12-02 11:27:44
【问题描述】:

我正在尝试编写一个 firebase 规则,通过检查另一个节点的数据来检查您是否有权访问一个节点的子节点。我遇到的问题是访问另一个节点的数据,因为它存储在 AutoId 下。如何访问 AutoId 下的数据?

这是我的数据库结构:

{
  "products" : {
    "Product001" : {
      "ownerId" : "User002",
      "productName": "Name"
    },
    "product002" : {
      "ownerId" : "User001",
      "productName": "Name"
    }
  },
  "shares" : {
    "share001" : {
      "accepted" : true,
      "ownerId" : "User002",
      "productId" : "Product001",
      "userEmail" : "example@email.com"
    },
    "share002" : {
      "accepted" : true,
      "ownerId" : "User001",
      "productId" : "Product002",
      "userEmail" : "email@exaple.com"
    }
  },
  "users" : {
    "User001" : {
      "email" : "example@email.com",
      "firstName" : "John",
      "lastName" : "Smith"
    },
    "User002" : {
      "email" : "email@example.com",
      "firstName" : "John",
      "lastName" : "Smith"
    }
  }
}

这是导致我出现问题的规则部分:

"products":{
  "$productId":{
     ".read":"root.child('shares').child($shareId).child('productId').val() === $productId && root.child('shares').child($shareId).child('ownerId').val() === auth.uid",
     ".write":"root.child('shares').child($shareId).child('productId').val() === $productId && root.child('shares').child($shareId).child('ownerId').val() === auth.uid"
  }
}

基本上,用户只有在包含其信息的共享中才被允许访问场所。

感谢您的建议。

【问题讨论】:

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


    【解决方案1】:

    安全规则中没有办法查询搜索另一个节点,因为那样的性能太不可靠了。因此,在您当前的数据模型中,如果用户拥有该产品的任何份额,则不可能允许用户访问该产品。

    您需要在用户可以阅读的产品的已知路径中的某处有一个列表。例如,假设您保留了用户感兴趣的产品列表:

      "interests" : {
        "User001" : {
          "Product001": true,
          "Product002": true
        },
    

    现在您可以允许用户访问他们关注的所有产品:

    "products":{
      "$productId":{
         ".read":"root.child('interests').child(auth.uid).child($productId).exists()",
         ".write": ...
      }
    }
    

    【讨论】:

    • 谢谢你的回复,不好意思是这样。此解决方法已解决我的问题。
    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2019-12-17
    • 2023-03-19
    • 1970-01-01
    • 2017-07-09
    • 2021-03-02
    相关资源
    最近更新 更多