Firebase Firestore 从数据库中检索用户数据时返回错误

Firebase Firestore retrieving user data from database returning error

提问人:Shani Mir 提问时间:11/9/2023 最后编辑:Frank van PuffelenShani Mir 更新时间:11/9/2023 访问量:30

问:

我正在尝试从Firestore中检索用户信息,它一直向我显示以下错误消息。

错误 = 侦听用户查询失败:权限缺失或不足

Firestore 安全规则:

match/user/{userId} {
  allow read: if request.auth.uid == userId;
  allow write: if true;
  allow update: if request.auth.uid == userId;
  allow delete: if request.auth.uid == userId;
}

法典

func getUser() {
    if let uid = Auth.auth().currentUser?.uid {
        db.collection("user").getDocuments { snapshot, error in
            if error == nil {
                if let snapshot = snapshot {
                    DispatchQueue.main.async {
                        self.userInfo = snapshot.documents.map { d in
                            return User(userId: d.documentID,
                                        email: d["email"] as? String ?? "",
                                        tokens: d["tokens"] as? Int ?? 0)
                        }
                    }
                }
            } else {
                Text("error")
            }
        }
    } else {
        Text("error")
    }
}

有没有人处理过这种问题?

如果将安全规则更改为允许读取:if request.auth.uid != null = 它将返回数据库中所有用户的用户数据,这是不正确的。

Swift Firebase 谷歌云 Firestore

评论


答:

1赞 Frank van Puffelen 11/9/2023 #1

您的规则仅授予用户读取其自己的文档的权限,但您的代码会尝试从集合中获取所有文档。安全规则不是筛选器,而是确保代码请求的数据不会超过其有权访问的数据。

因此,您需要更新代码以仅请求它有权访问的文档。像这样的东西:

db.collection("user").document(uid).getDocument { document, error in
  ...

与错误无关,但请注意,您的 和 规则在这里没有执行任何操作 - 因为您已经授予用户对同一集合的所有权限,并且包括 、 和 。由于规则更宽松,其他人不会做任何事情。updatedeletewritecreateupdatedeletewrite

有关更多信息,请查看有关精细权限的 Firestore 文档。