我有一系列文件。每个文档都有子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');
};
如何查询用户的文档?我猜这个被拒绝的权限与执行查询所需的读取限制有关。
答案 0 :(得分:1)
附加侦听器时,Firebase数据库强制执行读取权限。为了能够从/documents
阅读,您需要拥有/documents
的读取权限。由于您的安全规则不是这样,因此拒绝了侦听器。
这最初可能是违反直觉的,并且意味着安全规则不能用于以您尝试的方式过滤数据。这在文档中称为rules are not filters,并且是many previous questions的主题。我建议您查看其中一些内容,如果您有更多问题,请回复。
答案 1 :(得分:0)
规则不是过滤器,就像弗兰克所说的那样,他是对的,但是您可以进行一些查询,以实现类似于您在这种东西中所寻找的东西:>
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)