【问题标题】:Firebase rules to access specific child's value用于访问特定子项值的 Firebase 规则
【发布时间】:2017-04-29 11:15:56
【问题描述】:

如果您想在一个节点中保存多个相同类型的子节点,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。当用户访问列表时,我想要所有者为 John Doe(即 List-1List-3)的所有 List 子值,并忽略其他子值。

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

我目前的规则定义是:

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

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

【问题讨论】:

  • 您是否尝试过使用查询?
  • @gasho 是的,使用查询我可以拉下整个分支,然后只保留我需要的那些。但实际上我正在尝试从 firebase 本身提取所需的数据,这样我就不必在我的应用程序端运行任何查询。

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


【解决方案1】:

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

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

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

这种类型的列表通常被称为索引,因为它包含对实际帖子的引用。您还可以在Firebase documentation on structuring data 中找到有关此结构的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多