Firebase实时规则如何检查具有AutoID的节点是否包含正确的数据

时间:2019-12-02 11:27:44

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

我正在尝试编写一个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"
  }
}

本质上,仅允许用户访问包含其信息的共享中的场所。

谢谢您的建议。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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