swift - 使用 firebase realtime 创建隐藏的用户节点

标签 swift firebase firebase-realtime-database firebase-security

我在 Firebase 安全规则方面遇到了一些问题。我希望任何用户在建立帐户后都能够同时使用我的 iOS 应用程序创建一个帐户我希望有两个节点,一个是私有(private)的,一个是公共(public)的。我希望任何人都可以访问 public,包括用户本身,但是创建帐户的用户只能访问私有(private)节点。我尝试了很多东西,但我的工作似乎都不起作用。我想在不知道每个用户的 uid 的情况下通过链接获取所有公共(public)节点值

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

谢谢!!!!

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

This is my database

这是我的一些作品

{
  "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",
          },
        },
      },
    },
  },
}

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

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
}

最佳答案

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

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

这在 documentation 中也称为“规则不是过滤器”和以前的questions .

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

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

您必须将公共(public)和私有(private)数据分离到两个单独的顶级节点:privatepublic。这是 Firebase 文档建议保留您的 data structure flat 的众多原因之一。 .

另见:

关于swift - 使用 firebase realtime 创建隐藏的用户节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57264393/

相关文章:

ios - 在 Swift 中将 Markdown 格式的字符串转换为 NSAttributedString

ios - 如何获取swift int变量的地址

ios - 数据未出现在 View Controller 中

javascript - orderByChild 在 Firebase 中不起作用

android - 应用程序上的 FCM 已关闭

javascript - 如何找到父键未知的子键的值?

ios - 如何处理 %s 格式说明符

ios - 在 NavigationController 和 tabBarController 下使用 UIImagePickerController 时出错

ios - Swift - 当我添加新单元格时,所有单元格都会发生变化(需要单个单元格)

java - 从 Firebase 检索数据并将其打印出来