Cloud Firestore安全规则:用户私有规则不起作用

时间:2020-03-05 19:38:42

标签: swift firebase google-cloud-firestore

我正在尝试设置Cloud Firestore安全规则,以便仅将ID匹配文档ID的用户授予文档访问权限。 Firebase身份验证用于对用户进行身份验证,并使用用户特定的ID命名文档。 这些文档存储在“用户”集合中。

这是我的规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}

以下是对数据库进行查询的代码:

     func loadData () {
              
              //For Database
              let userID = Auth.auth().currentUser?.uid
              let db = Firestore.firestore()
              
              
              db.collection("Users/\(userID!)/Info").document("Info").getDocument { (document, error) in
                  
                  if error == nil {
                      //No error, check that document exists
                      
                      if document != nil && document!.exists {
                          
                          //Load the user data to the view controller
                              
                      } else {
                          //Show the error which has occured
                          print("Document does not exist")
                      }
                  } else {
                    //Show the error which has occured
                    print("Error loading user data")
                  
                  }
        }
    }

由于要查看的其他线程包含的代码完全相同,因此我无法理解这个问题。 Firebase模拟器给我一个错误:“模拟读取被拒绝”和“此匹配的访问被拒绝”。 在Xcode中,我收到错误消息:“ [Firebase / Firestore] [I-FST000001]在Users / DB9wtqM9h0OO1paMjNWAdsF4EgX2上侦听查询失败:缺少权限或权限不足。” 对UID进行硬编码确实可行,因此我认为这与文件路径有关。

请帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

您的规则实际上根本不适用于您显示的查询。规则将立即匹配Users集合中的文档,例如“ / Users / abc”。您的查询正在访问“用户”中的文档下组织的子集合。

如果要在嵌套在“用户”下的也称为“信息”的任何子集合中匹配ID为“信息”的文档,则规则应如下所示:

    match /Users/{userId}/Info/Info {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }

请注意文档的路径如何与查询中的文档完全匹配。

如果您想保护主集合下任何子集合中的文档,也可能需要阅读recursive wildcards