Правила безопасности Firestore для операций CRUD - PullRequest
0 голосов
/ 02 мая 2020

Я относительно новичок в Firebase и использую его для интеграции Firestore и аутентификации с приложением ReactJS, над которым я работаю.

Я знаю, что в коллекциях хранятся документы, а в действительности документы хранятся пары ключ-значение. У меня есть коллекция песен, и в ней есть следующие поля: -

  1. Создана метка времени

  2. Тексты песен

  3. Название песни

Я могу войти в систему пользователя с помощью аутентификации с помощью firebase, получить UID пользователя при входе в систему и создать новую песню, запись сделана в база данных с идентификатором документа в качестве UID.

Все это работает, только если мои правила установлены на

match /{document=**} {allow read, write:}

Когда я изменяю свои правила на это: -

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {
  match /songs/{songID} {
     allow read:  if request.auth!=null;
     allow write: if isValid();
  }

  function isValid(){
     return request.resource.data.uid == request.auth.uid;
  }}}

Я получаю следующую ошибку, когда Я запускаю его.

Unhandled Rejection (FirebaseError): Missing or insufficient permissions.

Я просто хочу убедиться, что вошедший в систему пользователь может читать, писать и обновлять свои собственные песни, и ничего кроме этого.

1) Я не могу понять, как создать правила firebase для достижения этой цели и предотвратить ошибки разрешения.

2) Если я использую идентификатор документа в качестве UID, то есть тот же документ ID для 5 песен. Как я смогу обновить название песни / текст песни, поскольку идентификатор документа для конкретного пользователя будет таким же?

1 Ответ

1 голос
/ 02 мая 2020

Я не могу понять, как создать правила Firebase для достижения этой цели и предотвратить ошибки разрешения.

Следующие правила помогут:

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {

    match /songs/{songID} {
       allow read:  if request.auth.uid == resource.data.uid;
       allow write: if isValid();
    }

    function isValid(){
       return request.resource.data.uid == request.auth.uid;
    }
  }
}

Я бы посоветовал вам посмотреть очень четкое видео, встроенное в эту страницу документации: https://firebase.google.com/docs/firestore/security/get-started?authuser=0


Если я использую идентификатор документа в качестве UID, то есть тот же идентификатор документа для 5 песен. Как я смогу обновить название / текст песни в песнях, поскольку идентификатор документа для конкретного пользователя будет одинаковым?

Нельзя использовать один и тот же идентификатор документа для другого документа Firestore. Идентификатор документа должен быть уникальным по определению. Лучше всего позволить Firestore создать идентификатор документа (например, с помощью метода add()) и добавить в документе автора uid, как вы уже сделали (так как вы делаете request.resource.data.uid ).

Затем вы можете создавать запросы, которые фильтруют документы, соответствующие пользователю uid. Например:

var user = firebase.auth().currentUser;

var songsRef = db.collection("songs");
var mySongsQuery = songsRef.where("uid", "==", user.uid);
...