Firebase规则用​​于访问特定子级的值

时间:2016-12-14 07:47:12

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

如果您想在节点中保存多个相同类型的子节点,childByAutoId会很有用,这样每个子节点都有自己唯一的标识符。

List:{
KJHBJJHB:{
  name:List-1,
  owner:John Doe,
  user_id:<Fire base generated User_id>
},
KhBHJBJjJ:{
  name:List-2,
  owner:Jane Lannister,
  user_id:<Fire base generated User_id>
},
KhBHJZJjZ:{
  name:List-3,
  owner:John Doe,
  user_id:<Fire base generated User_id>
}
}

我正在尝试借助以下代码访问List

let ref = FIRDatabase.database().reference(withPath: "/List")

登录应用的当前用户是John Doe。当用户访问列表时,我希望其所有者为List的所有John Doe孩子(即List-1&amp; List-3)并忽略其他子值。

我是否必须在我的应用程序中执行此操作,还是可以通过Firebase安全规则实现此目的?

我目前的规则定义是:

"List":{
 ".read": "root.child('List/'+root.child('List').val()+'/user_id').val() === auth.uid" }

但这条规则并没有给我任何成功。知道如何达到预期效果吗?

1 个答案:

答案 0 :(得分:1)

您正在尝试使用安全规则来过滤列表。这是不可能的,也是开发人员从SQL背景到Firebase的常见陷阱之一。我们通常将其称为“规则不是过滤器”,您可以在以下方面了解更多信息:

解决方案几乎总是一样的:保留每个用户有权访问的帖子的单独列表。

UserLists:{
  JohnUid: {
    KJHBJJHB: true,
    KhBHJZJjZ: true
  },
  JaneUid: {
    KhBHJBJjJ: true
  }
}

这种类型的列表通常被称为索引,因为它包含对实际帖子的引用。您还可以在Firebase documentation on structuring data

中找到有关此结构的更多信息