Пользователь уже прошел проверку подлинности в приложении, и база данных Firebase в реальном времени завершилась неудачно: access_denied - PullRequest
3 голосов
/ 01 мая 2019

Я пишу в базу данных и пытаюсь ее прочитать, она всегда говорит: fail: license_denied при использовании пользовательских правил из Firebase.Я пытаюсь писать и читать из Firebase, чтобы написать имя и фамилию.Схема дерева ниже.Пользователь входит в систему на первой раскадровке, а чтение и запись находятся на разных раскадровках и контроллерах представления.

Нужно ли проходить аутентификацию на том же VC, где я пытаюсь получить информацию?

Я могу сгенерировать UserID на разных VC, поэтому я не знаю, что тогда может делать.

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

- FIXДЛЯ ЧТЕНИЯ - Вот как работает чтение, запись работает только с кодом Кена, приведенным ниже!

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 Ответ

3 голосов
/ 01 мая 2019

Ваши правила верны, единственная проблема в том, что при записи в вашу базу данных вы должны сказать, что userID находится под узлом users. Не забудьте инициализировать вашу базу данных следующим образом:

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

Вот ваш обновленный НАПИСАТЬ код:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...