Firebase数据库规则o如何过滤数据

时间:2018-06-16 10:10:54

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

我要实现的目标是向经过身份验证的用户显示与其他用户共享的“事件”列表,特别是仅显示用户本身所属的事件。

我想到的初始结构是:

events:{ 
   "eventId1":{ 
      "title":"some text",
      "members":{
          "myAuthUID":true,
          "anotheUserUId":true
      }
   }
   "eventId2":{ 
      "title":"some text",
      "members":{
          "anotheUserUId":true
      }
   }
}

我实施的规则如下。但它失败了porpouse:

{
  "rules": {
    ".read":"auth.uid !== null",
    ".write": "auth.uid !== null",
    "events":{
      "$evtId":{
       ".read":"data.child('members').child(auth.uid).exists()",
        ".write": "data.child('admins').hasChild(auth.uid)",


      }
    }
  }
}

调用/事件所有事件都是showm

使用myAuthUID调用/ events / eventId2成功。

结果必须是,只显示eventId1到muAuthUser

您能帮我更好地构建数据模型和/或退还规则吗?

同时我会寻找这个简单问题的解决方案:)

感谢

1 个答案:

答案 0 :(得分:1)

首先:顶级".read":"auth.uid !== null"表示所有经过身份验证的用户都可以读取整个数据库。一旦您在数据库中授予某个级别的许可,您就无法在较低级别获得该许可。因此,.read /events/$evtId的{​​{1}}规则目前无用。

下一步是rules are not filters。附加监听器时,Firebase会检查您的规则,并且将在那时(并且仅在那时)评估整个条件。实际上,这意味着安全规则不能用于过滤数据。之前经常有人问这个问题,所以我建议您查看一些previous questions on the topic

最近,Firebase添加了保护您在某个节点上允许的查询的功能。因此,您可以允许从/users读取,但只有在他们对特定属性进行排序/过滤时才允许读取。有关详细信息,请参阅documentation on query based rules。但是,我不确定这是否会允许您的用例。之前有一个类似的问题,所以我建议也监听那个,以防有人在那里回答:How to filter by orderByChild containing a string in Firebase query-based rules

我对您的用例的常用解决方案:您当前的数据模型允许您有效地读取/查询事件的成员。它不允许您有效地读取成员的事件。要允许后者,请添加其他数据结构:

members
  memberId1:
    events
      eventId1: true
      eventId2: true
  memberId2:
    events
      eventId1: true
      eventId3: true

现在这更容易保障。