在用户有权在firebase中阅读的文档中进行搜索

在用户有权在firebase中阅读的文档中进行搜索,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我有一套文件。每个文档都有子uid,它是对所有者的引用。示范文件: { "uid": "slfjs092320i3jf023jf", "content": "Example" } 我想将它们存储在/documents集合下,并且只允许具有匹配uid的用户存储和检索它们。我创建了以下规则: { "rules": { "documents": { "$documentId": { ".read": "data.child('uid').val() =

我有一套文件。每个文档都有子
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数据库强制执行读取权限。要能够阅读
/文档
,您需要拥有对
/文档
的阅读权限。由于您的安全规则并非如此,侦听器将被拒绝

这在一开始可能是违反直觉的,这意味着安全规则不能用于以您尝试的方式过滤数据。这在文档中称为,并且一直是本文的主题。我建议您查看其中一些,如果您有更多问题,请反馈。

查看

正如Frank所说,规则不是过滤器,他是对的,但你可以通过一些查询来实现类似于你所期望的这类东西:

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) 

谢谢你的回复。存储这些数据的好方法是什么?假设我的文档也有类别。我应该创建两个集合吗?一个名为
usersDocuments
,结构为{$uid:{content:{example}},第二个名为
documentsWithCategories
,结构为{$category:{document1tId:true,document2Id:true}?通常,对于当前结构无法满足的每个用例,您都会得到一个顶级列表。这些列表可以是完全/部分重复的,也可以只是手动索引(如在您的注释中)。