【发布时间】:2018-03-22 22:00:56
【问题描述】:
我的 Cloud Firestore 数据库中有以下规则:
service cloud.firestore {
match /databases/{database}/documents {
match /performances/{performanceId} {
allow read, update, delete: if request.auth.uid == resource.data.owner;
allow create: if request.auth.uid != null;
}
}
}
这个想法是,如果您拥有表演,则可以读取和写入表演,或者如果您已登录,则可以创建表演。
这个查询工作正常:
db.collection("performances").whereEqualTo(FieldPath.of("owner"), user.getUid())
但是,如果我想获取“场景”子集合的内容,则会收到错误消息:“com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:权限缺失或不足。” 这与以下查询有关:
db.collection("performances")
.document(performanceID)
.collection("scenes");
我假设我需要将查询限制为以下内容,但这不会起作用,因为 whereEqualTo 的输出是查询而不是 CollectionReference,因此我无法访问“文档”:
db.collection("performances")
.whereEqualTo(FieldPath.of("owner"), user.getUid())
.document(performanceID)
.collection("scenes");
那么,如果主集合有安全规则,有谁知道我应该如何访问子集合?
更新1(因为下面评论中的代码没有格式化)
我想我可能想出了一个解决方案。我没有意识到默认情况下我的安全规则会拒绝从子集合中读取,因此将其更改为允许对表演中的场景进行所有读取和写入使其正常工作:
service cloud.firestore {
match /databases/{database}/documents {
match /performances/{performanceId} {
allow read, update, delete: if request.auth.uid == resource.data.owner;
allow create: if request.auth.uid != null;
match /scenes/{sceneId} {
allow read, write: if true
}
}
}
}
【问题讨论】:
-
我想我可能想出了一个解决方案。我没有意识到默认情况下我的安全规则会拒绝从子集合中读取,因此将其更改为允许对性能中的场景进行所有读取和写入使其工作正常: service cloud.firestore { match /databases/{database}/documents { match /performances/{performanceId} { 允许读取、更新、删除:如果 request.auth.uid == resource.data.owner;允许创建:如果 request.auth.uid != null;匹配 /scenes/{sceneId} { 允许读取,写入:如果为真 } } } }
-
还可以查看通配符语法
{name=**}。 firebase.google.com/docs/firestore/security/…
标签: android firebase google-cloud-firestore