Почему правило cloud firestore не соответствует моему шаблону path?

#firebase #google-cloud-firestore #firebase-security

#firebase #google-cloud-firestore #firebase-безопасность

Вопрос:

Итак, у меня простая база данных, и я хочу создать простое правило, но по какой-то причине оно не хочет соответствовать моей коллекции

введите описание изображения здесь

 service cloud.firestore {
  match /databases/{database}/documents {

    match /userPrivate/{user=**} {
      allow read, write: if request.auth.uid == user;
    }

  }
}
  

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Вы неправильно указываете документ для извлечения. В текстовом поле, которое запрашивает у вас местоположение документа, не добавляйте /databases/(default)/documents . Это добавляется для вас автоматически. Вы должны указать путь к документу, используя коллекцию и идентификатор документа. Например: /userPrivate/uid где «uid» — это идентификатор документа. Вероятно, вам также следует включить аутентификацию в симуляторе, чтобы идентификатор соответствовал.

Также имейте в виду, что когда вы используете подстановочный знак с двумя звездочками типа /userPrivate/{user=**} , тогда user переменная будет содержать весь путь к документу, включая любые вложенные коллекции. Это означает, что ваше правило не будет работать для документов из вложенных коллекций.

Ответ №2:

Вам необходимо адаптировать свои правила следующим образом:

 service cloud.firestore {
  match /databases/{database}/documents {

    match /userPrivate/{user} {
      allow read, write: if request.auth.uid == user;
    }

  }
}
  

Ваш подстановочный знак должен указывать на единственный документ path (который вы получаете, выполняя { user} ) и не соответствовать ни одному документу из userPrivate коллекции (который вы получаете, выполняя { user=**} , другими словами «остальная часть пути»).

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

 service cloud.firestore {
  match /databases/{database}/documents {

    match /userPrivate/{user} {
      allow read, write: if request.auth.uid == user;

      match /{userCollec=**} {
        allow read, write: if request.auth.uid == user;
      }

    }

  }
}
  

Я бы посоветовал вам посмотреть это официальное видео Firebase о правилах безопасности Firestore: https://www.youtube.com/watch?v=eW5MdE3ZcAw amp;, в частности, часть, начинающаяся с 5 минут.

Комментарии:

1. Вы уверены, что OP на самом деле не хочет защищать все документы, включая все те, что находятся во вложенных коллекциях, организованных в коллекции userPrivate? Ваше предложение этого не делает.

2. @DougStevenson Вы правы, я не на 100% уверен в требованиях OP, поэтому я не рассмотрел случай вложенных коллекций… Я адаптировал свой ответ для этого случая. Спасибо, что указали на это.

3. @ditoslav Привет, у тебя была возможность попробовать предложенный ответ?