Firestore安全规则,嵌套字段

时间:2017-10-26 18:37:12

标签: firebase-security google-cloud-firestore

我们的数据库结构如下:

trips
   12345
      toArea
         radius: 150
         name: "citycenter"
   54321
      toArea
         radius: 250
         name: "main street"

我们尝试创建一些从文档中读取的规则:

match /chats/{trip} {
    match /messages/{message} {
       allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data.toArea != null
    }
}

它运作正常

但接下来的规则不起作用:

allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data.toArea != null
allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data.toArea.radius != null
allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data.toArea.radius == null
allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data.toArea["radius"] == null
allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data.toArea["radius"] != null
allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data["toArea.radius"] == null
allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data["toArea.radius"] != null

我真的不明白它有什么问题,两个相反的规则(== null /!= null)怎么可能不起作用。我们如何在规则中使用字段 toArea.radius 进行管理?

1 个答案:

答案 0 :(得分:2)

编辑(12/18/17):这些都已修复,所以这应该是Just Work™。

正如@hatboysam所提到的那样,您目前正在点击我们正在迅速修复的两个错误:

  1. get().data仅适用于您的规则中某处resource.datarequest.resource.data的引用(我们过去常常支持get()返回resource不使用data,但最终出现问题,因此在发布之前就已经更改了。)
  2. 嵌套属性(例如toArea.radius)已损坏。
  3. 1很容易解决:

    match /chats/{trip} {
        match /messages/{message} {
           allow read, write: if get(/databases/$(database)/documents/trips/$(trip)).data.toArea != null
        }
    }
    match /bogusPathThatWillNeverMatch {
      allow read: if resource.data != null; // should never be true
    }
    

    1和2都将很快修复,敬请期待分辨率。