首页 > 解决方案 > 你如何观察一个没有覆盖低级子规则的高级子级的快照?

问题描述

JSON

"users" : {
"02PdiNpmW3MMyJt3qPuRyTpHLaw2" : {
  "Coordinates" : {
    "latitude" : -24.809620667034363,
    "longitude" : 28.321706241781342
  },
  "Education" : "6", ........./// here are 10 Childs further on same level as education
  "Music"

目前的规则

{
"rules": {
   ".read": false,
   ".write": false,
,    "users": {
       "$uid": {
         "Education" :{
         ".read": "$uid == auth.uid",
         ".write": "$uid == auth.uid"
}

根据我的理解,如果我让用户为授权用户阅读规则,它将覆盖教育规则。下面是需要用户阅读规则的地方

  let artist = Database.database().reference().child("users").queryOrdered(byChild: "music").queryStarting(atValue:dateToday.timeIntervalSince1970*1000)
artist.observe(DataEventType.value,  with: {  snapshot in

更新:我在规则中有一个错字“用户”

标签: iosswiftfirebasefirebase-realtime-databasefirebase-security

解决方案


一般来说,确实规则是,如果您授予某人对节点的读(或写)访问权限,他们对该节点下的所有数据具有相同的访问权限。因此,您不能只说".read": true他们/people会读取整个节点。

可以做的是指定您的安全规则中允许的查询。因此,要允许每个人读取具有给定music值的所有节点,您可以执行以下操作:

"baskets": {
  ".read": "query.orderByChild == 'music' &&
            query.equalTo > 1354867200000"
}

这里要记住几件事:

  • 我在这里对其进行了硬编码,但是您必须以某种方式根据now变量计算规则中过滤器的值。
  • 您只能过滤单个值,因此不能同时过滤musicuid。您可以将这两个值合并到一个属性中并对其进行排序/过滤。有关更多信息,请参阅:基于 Firebase 中的多个 where 子句的查询

推荐阅读