首页 > 解决方案 > 使用firebase实时创建隐藏用户节点

问题描述

我在使用 Firebase 安全规则时遇到了一些问题。我希望任何用户都能够在他或她建立帐户后同时使用我的 iOS 应用程序创建一个帐户,我希望有两个节点,一个是私有的,一个是公共的。我希望任何人都可以访问公众,包括用户自己,但创建帐户的用户只能访问私有节点。我已经尝试了很多东西,但我的工作似乎都没有奏效。我想通过仅具有链接而不知道每个用户的 uid 来获取所有公共节点值

1- 任何人都可以创建一个帐户 2- 只有用户可以访问他自己的私有节点 3- 一个链接,我只能获取用户的所有公共节点

谢谢!!!!

例如,我想获取所有用户https://id.firebaseio.com/Ireland.json

这是我的数据库

这是我的一些工作

{
  "rules": {
    "Ireland": {
      "users": {
        "$uid": {
          "private": {
            ".read": "auth != null && auth.uid == $uid",
            ".write": "auth != null && auth.uid == $uid",
          },
          "public": {
            ".read": true,
            ".write": "auth != null && auth.uid == $uid",
          },
        },
      },
    },
  },
}

这是我的快速代码,但每次我尝试创建一个帐户时,它都会说权限被拒绝

guard let uid = result?.user.uid else { return }

let privateValues = ["email": email, "username": username, "password": password, "profileImageUrl": profileImageUrl, "country": "Ireland"]
let publicValues = ["username": username, "profileImageUrl": profileImageUrl]

let values = [uid: ["private": privateValues, "public": publicValues]]

                    Database.database().reference().child("Ireland").child("users").updateChildValues(values, withCompletionBlock: { (error, reference) in
if let error = error {
print("Failed to save user info to database: ", error)
self.signUpButton.wiggle()
return
}

标签: swiftfirebasefirebase-realtime-databasefirebase-security

解决方案


Firebase 安全规则不能用于过滤数据。他们所做的只是检查是否允许某个读取操作,而不检查每个单独的节点。

因此,如果您将侦听器附加到/Ireland,服务器会检查当前用户是否具有对 的读取权限/Ireland。由于没有人拥有该级别的权限,因此读取操作被拒绝。

这在文档和之前的问题中也称为“规则不是过滤器” 。

去年 Firebase 添加了对验证安全规则中的查询的支持,例如,您可以允许查询也按ownerUID类型属性进行过滤。有关更多信息,请参阅有关基于查询的规则的文档。

但这也不适用于您的用例,因为读取操作总是返回完整节点。这让我们回到了安全规则不能用于过滤数据的事实。

您必须将公共和私有数据分成两个单独的顶级节点:privatepublic. 这是 Firebase 文档建议保持数据结构平坦的众多原因之一。

另见:


推荐阅读