用户已在应用中进行身份验证并且Firebase实时数据库返回失败:Permission_denied

时间:2019-04-30 23:08:51

标签: swift firebase firebase-realtime-database firebase-authentication

我正在写数据库并尝试读取它,它总是显示:失败:使用Firebase中的用户规则时,permission_denied。我正在尝试从Firebase读写,以写入名字和姓氏。树的布局在下面。用户在第一个情节提要板上登录,并且读取和写入在不同的情节提要板上和视图控制器上。

我需要在与尝试获取信息的VC上进行身份验证吗?

我能够在不同的VC上生成UserID,所以我不知道接下来该怎么做。

WRITE
ref?.child(userID).child("FirstName").setValue(firstName.text!)
READ
if let snap = snapshot.value as? [String : AnyObject] {
                if let firstNameResult = snap["FirstName"] as? String {
                    self.firstNameLabel.text = firstNameResult
                }else{
                    print("Error")
                }
            }else{
                print("User ID is not valid")
            }
FIREBASE RULES
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
TREE LAYOUT
IdentificationStorage
    USERID generated
        FirstName
        LastName

-修复阅读- 这是读取的工作方式,写入仅使用下面提供的代码Ken起作用!

let ref = Database.database().reference().child("users/\(userID)")
        ref.observeSingleEvent(of: .value, with: { snapshot in

            guard snapshot.exists() else { return print("Invalid User ID") }
            self.firstNameLabel.text = snapshot.get("FirstName") as? String

            guard snapshot.exists() else { return print("Invalid User ID") }
            self.lastNameLabel.text = snapshot.get("LastName") as? String
        })

    }

1 个答案:

答案 0 :(得分:2)

您的规则是正确的,唯一的问题是,在写入数据库时​​,您需要说userIDusers节点下。记住要像这样初始化数据库:

let ref = Database.database().reference()

这是您更新的 WRITE 代码:

ref.child("users/\(userID)/FirstName").setValue(firstName.text!)

我个人希望为DataSnapshot创建扩展名,以使字段的获取变得容易:

extension DataSnapshot {
    func get(_ field: String) -> Any? {
        return (value as? [String : Any])?[field]
    }
}

只需将其复制并粘贴到ViewController之外的任何位置。使用此功能,您可以将 READ 代码重构为此:

guard snapshot.exists() else { return print("Invalid User ID") }
self.firstNameLabel.text = snapshot.get("FirstName") as? String

作为一个旁注,惯例是将Firebase字段设置为lowerCamelCase,就像Swift中的变量一样。