#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 Привет, у тебя была возможность попробовать предложенный ответ?