Правила безопасности Cloud Firestore: личные правила пользователя не работают - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь настроить правила безопасности Cloud Firestore, чтобы доступ к документу предоставлялся только пользователю, идентификатор которого совпадает с идентификатором документа. Аутентификация Firebase используется для аутентификации пользователя и присвоения имени документу идентификатора пользователя c ID. Документы хранятся в коллекции «Пользователи».

Вот мои правила:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}

Вот код, который делает запрос к базе данных:

     func loadData () {
              
              //For Database
              let userID = Auth.auth().currentUser?.uid
              let db = Firestore.firestore()
              
              
              db.collection("Users/\(userID!)/Info").document("Info").getDocument { (document, error) in
                  
                  if error == nil {
                      //No error, check that document exists
                      
                      if document != nil && document!.exists {
                          
                          //Load the user data to the view controller
                              
                      } else {
                          //Show the error which has occured
                          print("Document does not exist")
                      }
                  } else {
                    //Show the error which has occured
                    print("Error loading user data")
                  
                  }
        }
    }

Я изо всех сил пытаюсь понять проблему, поскольку другие потоки, на которые я смотрел, которые содержат точно такой же код, не работают. Имитатор Firebase выдает ошибку: «Имитация чтения запрещена» с «Доступ запрещен для этого совпадения». В Xcode я получаю сообщение об ошибке: «[Firebase / Firestore] [I-FST000001] Прослушивать запрос в Users / DB9wtqM9h0OO1paMjNWAdsF4EgX2 не удалось: отсутствуют или недостаточно разрешений». Жесткое кодирование UID работает, поэтому я предполагаю, что это как-то связано с путем к файлу.

Пожалуйста, помогите, спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Ваши правила на самом деле не применяются к запросу, который вы показываете. Правила only будут соответствовать документам, находящимся непосредственно в коллекции Users, например, "/ Users / ab c". Ваш запрос обращается к вложенной коллекции, организованной в виде документов в Users.

Если вы хотите сопоставить документ с идентификатором «Info» в любой вложенной коллекции, также называемой «Info», вложенной в «Users», ваше правило должно выглядеть следующим образом :

    match /Users/{userId}/Info/Info {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }

Обратите внимание, что путь документа полностью соответствует документу в запросе.

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

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