我对这些规则不熟悉,有些基本内容我不明白。以下规则不起作用:
service cloud.firestore {
match /databases/{database}/documents {
match /usernames/{username} {
allow read: if true;
allow write: if request.auth != null;
}
match /users/{userId} {
allow read, write: if request.auth != null;
}
match /universes/{universe}/{document=**} {
allow read, write: if request.auth != null &&
get(/databases/$(database)/documents/universes/$(universe)).data.isPublic == true;
}
}
}
但是,如果我将 $(universe) 替换为现有文档的名称(基本上是对其进行硬编码),它确实有效吗?!我以为 $(universe) 为所讨论的宇宙的名称提供了一个变量,但是唉!!
不适用于 $(universe) 但适用于硬编码文档名称的查询是:
FirebaseFirestore.instance.collection('universes').snapshots()
如果设置为 $(universe) 与现有文档名称,则会出现以下错误:
W/Firestore(27925):(25.0.0) [Firestore]:监听查询(target=Query(universe order by name);limitType=LIMIT_TO_FIRST)失败:状态{code=PERMISSION_DENIED,描述=缺失或不足权限。,原因=null}
我想要的是有人能够在公共宇宙中读取或写入任何文档。谢谢!
Firestore 安全规则不是过滤器。 请仔细阅读该文档以了解该问题。
您的查询正在询问 Universes 集合中的所有文档,没有过滤器。 但是,您似乎希望规则根据内容过滤掉某些文档。 安全规则不是这样运作的。规则无法从查询结果中过滤文档。 他们只能确保对查询应用了适当的过滤器。
如果您想要获取
isPublic
为 true 的 Universe 中的所有文档,您将需要在查询本身上应用该过滤器,以便满足规则的要求:
FirebaseFirestore.instance
.collection('universes')
.where("universes", isEqualTo: true)
.snapshots()