我们的数据库结构如下:
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 进行管理?
答案 0 :(得分:2)
编辑(12/18/17):这些都已修复,所以这应该是Just Work™。
正如@hatboysam所提到的那样,您目前正在点击我们正在迅速修复的两个错误:
get().data
仅适用于您的规则中某处resource.data
或request.resource.data
的引用(我们过去常常支持get()
返回resource
不使用data
,但最终出现问题,因此在发布之前就已经更改了。)toArea.radius
)已损坏。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都将很快修复,敬请期待分辨率。