在用户有权在firebase

时间:2017-11-29 22:39:29

标签: firebase firebase-realtime-database firebase-security

我有一系列文件。每个文档都有子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');
};

如何查询用户的文档?我猜这个被拒绝的权限与执行查询所需的读取限制有关。

2 个答案:

答案 0 :(得分:1)

附加侦听器时,Firebase数据库强制执行读取权限。为了能够从/documents阅读,您需要拥有/documents的读取权限。由于您的安全规则不是这样,因此拒绝了侦听器。

这最初可能是违反直觉的,并且意味着安全规则不能用于以您尝试的方式过滤数据。这在文档中称为rules are not filters,并且是many previous questions的主题。我建议您查看其中一些内容,如果您有更多问题,请回复。

答案 1 :(得分:0)

看看query based rules

规则不是过滤器,就像弗兰克所说的那样,他是对的,但是您可以进行一些查询,以实现类似于您在这种东西中所寻找的东西:

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)