安全规则的Firebase通配符路径不起作用?

时间:2016-03-16 13:51:56

标签: firebase firebase-security

我使用Objective-C API for Firebase获取数据,并且当我的安全规则(通过Firebase在线仪表板设置)不使用任何通配符路径时,我能够这样做,例如:< / p>

{
  "rules": {
    "user" : {
      ".read" : true,
      ".write" : true
    },
    "users" : {
      ".read" : true,
      ".write" : false
    }
  }
}

但是当我尝试使用通配符路径和获取对象来制定应该是相同的安全规则时,完成处理程序永远不会执行,例如:

{
  "rules": {
    "user" : {
      ".read" : true,
      ".write" : true
    },
    "users" : {
      "$userId" : {
        ".read" : true,
        ".write" : false
      }
    }
  }
}

我在以下网址使用了Firebase文档,无法弄清楚我做错了什么:https://www.firebase.com/docs/security/quickstart.html

我不认为问题是针对Objective-C的,但为了彻底,我使用方法-[FQuery observeSingleEventOfType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { }]来获取我的数据。

更新:以下是{I}用于调试的特别FQuery的输出:

po query

更新2:以下是我的数据结构,如果相关:

(/users {
    ep = 0;
    i = hidden;
    sp = 0;
})

更新3:以下是我创建FQuery对象的Objective-C代码:

{
  "user" : {
    "HhMeloQDY4" : {
      "info" : {
        "name" : "Anita Borg"
      }
    },
    "QxnjCNOj3H" : {
      "info" : {
        "name" : "Charles Babbage"
      }
    },
    "zeNalC4ktf" : {
      "info" : {
        "name" : "Beyoncé"
      }
    }
  },
  "users" : {
    "HhMeloQDY4" : {
      "hidden" : false
    },
    "QxnjCNOj3H" : {
      "hidden" : false
    },
    "zeNalC4ktf" : {
      "hidden" : true
    }
  }
}

1 个答案:

答案 0 :(得分:2)

您已在路径/users/specific_user_id/添加了读访问权限,但您正尝试读取路径/users/,该路径不允许读取访问。

您需要提供对您尝试阅读的路径的访问权限,而不仅仅是其子项的子集。请参阅security rules are not filters

编辑:只需添加一些ObjC代码即可明确

显示查询

Firebase *directory = [self.myRootRef childByAppendingPath:@"users"];

您正在查询用户节点内的节点。但是,如果您查看结构,那么用户节点内部的内容是不可查询的,因为 / users下没有直接在我评论过的地方。

"users" : {
  //OH NOES! There are no rules here!
  "$userId" : {
     ".read" : true,
     ".write" : false
   }

您的规则位于$ userId中,它仅代表并适用于该父级

"$userId" : {
    //these rules *only* apply inside each userId.
    ".read" : true,
    ".write" : false
}

因此,对于您的结构,此查询将起作用,它将仅查询users / HhMeloQDY4内的内容。

Firebase *directory = [self.myRootRef childByAppendingPath:@"users/HhMeloQDY4"];

因此,最终结果是您需要直接在/ users节点下分配规则,以允许您查询其子节点中的内容。

"users" : {
  ".read" : true,
  ".write" : false
  "$userId" : {
  }

这将允许您读取用户节点($ userId及其子级)下的每个节点,但不能写入它们。