我有一个文件集。每个文件都有子uid
,它是对所有者的引用。示例文件:
{
"uid": "slfjs092320i3jf023jf",
"content": "Example"
}
我想将它们存储在/documents
集合下,并且只允许具有匹配uid的用户存储和检索它们。我创建了以下规则:
{
"rules": {
"documents": {
"$documentId": {
".read": "data.child('uid').val() === auth.uid",
".write": "newData.exists() && newData.child('uid').val() === auth.uid || data.exists() && data.child('uid').val() === auth.uid",
".indexOn": ["uid"]
}
}
}
}
不幸的是,当我想要检索用户的文档时,我收到了拒绝的权限。要检索我使用的文件:
export default getUserDocuments = () => {
const userUid = firebase.auth().currentUser.uid;
return firebase.database()
.ref('/documents')
.orderByChild('uid')
.equalTo(userUid)
.once('value');
};
如何查询用户的文档?我想拒绝的权限与执行查询所需的读取限制有关。
附加侦听器时,Firebase数据库强制执行读取权限。为了能够从/documents
读取,您需要获得/documents
的读取权限。由于您的安全规则不是这种情况,因此拒绝侦听器。
这最初可能是违反直觉的,并且意味着安全规则不能用于以您尝试的方式过滤数据。这在文档中被称为rules are not filters,并且一直是many previous questions的主题。我建议您查看其中一些内容,如果您有更多问题,请回复一下。
规则不是过滤器,正如弗兰克所说,他是对的,但是你可以通过这种方式对工作进行一些查询并获得类似于你所寻求的东西:
baskets": {
".read": "auth.uid != null &&
query.orderByChild == 'owner' &&
query.equalTo == auth.uid" // restrict basket access to owner of basket
}
然后,这将工作:
db.ref("baskets").orderByChild("owner")
.equalTo(auth.currentUser.uid)
.on("value", cb)
而且,这不会:
db.ref("baskets").on("value", cb)