Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase实时规则如何检查具有AutoID的节点是否包含正确的数据_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

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

Firebase实时规则如何检查具有AutoID的节点是否包含正确的数据,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我试图编写一个firebase规则,通过检查另一个节点的数据来检查您是否有权访问一个节点的子节点。我遇到的问题是访问另一个节点的数据,因为它存储在AutoId下。如何访问AutoId下的数据 以下是我的数据库结构: { "products" : { "Product001" : { "ownerId" : "User002", "productName": "Name" }, "product002" : { "ownerId" :

我试图编写一个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"
  }
}
本质上,用户只有在共享包含其信息时才允许访问某个场所


谢谢您的建议。

在安全规则中无法查询或搜索其他节点,因为这样做的性能太不可靠了。因此,在您当前的数据模型中,如果用户拥有某个产品的任何共享,则不可能允许用户访问该产品

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

  "interests" : {
    "User001" : {
      "Product001": true,
      "Product002": true
    },
现在,您可以允许用户访问他们使用的所有产品:

“产品”:{
“$productId”:{
.read:“root.child('interests').child(auth.uid).child($productId.exists()”,
“.write”:。。。
}
}

谢谢你的回复,真遗憾就是这样。此解决方法解决了我的问题。