Правило базы данных Firestore работает в симуляторе, но не в приложении - PullRequest
1 голос
/ 29 мая 2019

Я создаю приложение React Native и только начинаю создавать все правила безопасности в моей базе данных Firestore.У меня есть несколько правил, которые работают хорошо, но есть одно правило, которое в значительной степени идентично рабочим, которое дает мне Error: Missing or insufficient permissions. Что еще более странно, что когда я проверяю это правило в симуляторе Firestore, оно проходит без каких-либо проблем.

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

Вот соответствующие правила:

service cloud.firestore {
  match /databases/{database}/documents {
    function getCurrentTeam() {
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.lastTeam;
    }

    function signedIntoTeam() {
      // For context, all "like" documents have an associated teamId.
      return request.auth.uid != null && getCurrentTeam() == resource.data.teamId;
    }

    match /likes/{like} {
      allow read: if signedIntoTeam();
    }

  }
}

Вотфункция в моем приложении React Native, которая выдает ошибку:

const getLikes = posts =>
    new Promise((resolve, reject) => {
        const likedPosts = [];
        if (!posts.length) return resolve(likedPosts);
        posts.forEach(post => {
            if (post.likeCount > 0) {
                firebase
                    .firestore()
                    .collection('likes')
                    .where('postId', '==', post.id)
                    .where('userId', '==', firebase.auth().currentUser.uid)
                    .get()
                    .then(querySnapshot => {
                        const likedByUser = querySnapshot.size > 0;
                        likedPosts.push({ ...post, likedByUser });
                        if (likedPosts.length === posts.length) resolve(likedPosts);
                    })
                    .catch(err => reject(err));
            } else {
                likedPosts.push({ ...post, likedByUser: false });
                if (likedPosts.length === posts.length) resolve(likedPosts);
            }
        });
    });

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

1 Ответ

0 голосов
/ 29 мая 2019

Ваше правило пытается отфильтровать документы из коллекции likes на основе содержимого поля teamId документа. Если ваш запрос также не фильтруется с использованием тех же критериев, правило всегда отклоняет запрос. Это связано с тем, что правила безопасности не являются фильтрами . Пожалуйста, прочитайте связанную документацию.

Если у вас есть правило, клиент всегда должен фильтровать поле teamId. Прямо сейчас это просто фильтрация по postId и userId. К этому следует добавить teamId или изменить правило в соответствии с запросом. Запрос и правило должны быть синхронизированы - запрос должен только запрашивать документы, которые, как известно, считываются правилом, - он не должен полагаться на правило для внесения изменений в набор результатов.

...