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

Posted

技术标签:

【中文标题】Firebase 实时规则如何检查具有 AutoID 的节点是不是包含正确的数据【英文标题】: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"
  

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

感谢您的建议。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

谢谢你的回复,不好意思是这样。此解决方法已解决我的问题。

以上是关于Firebase 实时规则如何检查具有 AutoID 的节点是不是包含正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

检查 Firebase 实时数据库中的现有值

Firebase 存储安全规则:检查是不是存在另一个对象/检查对象的元数据

如何在firebase实时数据库中编写规则?

如何在firebase实时数据库规则中设置变量

Firebase 实时规则

Firebase安全规则,在不同位置具有读写功能