Как я могу настроить правила, чтобы я мог писать документы в пожарный магазин, защищенный uid? - PullRequest
0 голосов
/ 08 октября 2018

Я хочу сделать так, чтобы аутентифицированные пользователи могли выполнять запись в коллекцию, доступную только для чтения / записи / создания этого пользователя.Я борюсь с самой основной настройкой Firestore.Мои правила для firestore выглядят так:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{userId} {
      allow read, write, create: if request.auth.uid == userId;
    }
  }
}

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

Мой код JavaScript выглядит следующим образом:

function addSomeData(data) {
    console.log( "Sending data with: ", user.uid, data );
    db.collection(user.uid).add({ data })
        .then(function(docRef) {
            console.log("Document written with ID: ", docRef.id);
        })
        .catch(function(error) {
            console.error("Error adding document: ", error);
        });
}

Я определенно правильно установил user.id после успешного входа в систему.

Такое использование всегда выдает мне ошибку в консоли:

Ошибка при добавлении документа: ошибка: отсутствуют или отсутствуют разрешения.

Если я вернусь к таким исходным правилам, как этот, документ будет успешно создан:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

То, что я пытаюсь сделать, - это начинать каждую коллекцию с UID вошедшего в систему пользователя.Итак, пример формы данных может быть таким:

/ax323/brty/data="Hello"
/ax323/98da/data="Goodbye"
/br981/ha31/data="No comment"

Итак, ax323 - это UID в Firebase, как и br981.У ax323 есть два документа в коллекции, а у br981 - один.

Проблема в форме моих данных?

Я не совсем понимаю, что означает {document=**} в исходных правилах, и нужно ли мне преобразовывать мое правило аутентификации во что-то подобное.

1 Ответ

0 голосов
/ 08 октября 2018

В ваших правилах базы данных вы использовали match /users/{userId} { Это правило будет применяться только к документу, в котором указан этот конкретный путь.Поэтому, если ваш путь к документу /ax323/brty/data, тогда ваши правила должны быть такими:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{userId}/{document=**} {
      allow read, write, create: if request.auth.uid == userId;
    }
  }
}

Также, глядя на ваш вопрос, я не могу понять, что означает brty, когда вы упомянули

/ax323/brty/data="Hello"?

...