Firestore может читать коллекцию ('users'), но не может c ('users / {id}') - PullRequest
0 голосов
/ 01 апреля 2020

Я использую @react-native-firebase/firestore

Я должен неправильно продумывать коллекции или документы, но я бы ожидал, что приведенные ниже правила безопасности не позволят мне получить документы через onSnapshot, если им будет отказано при прямом получении их через doc, но это не так

// I get permission denied when doing this
firestore().doc('users/KRImYj0Lrmv00P9KRAuJ').get()

// I do not get permission denied when doing this and can access the document I can't get above
firestore().collection('users').onSnapshot() 

Правила безопасности

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{user} {
      allow read: if resource.data.is_deleted == false
      allow write: if false;
    }
  }
}

ОБНОВЛЕНИЕ ПОЛНОГО КОДА

// FIRST
try {
  await firestore()
    .collection('users')
    .where('is_deleted', '==', true)
    .onSnapshot((snapshot) => {
      if (snapshot) {
        snapshot.forEach((s) => {
          console.log('User', s.data())
        })
      }
    })
}
catch (error) {
  console.log(error)
}
// SECOND
try {
  const docs = await firestore()
    .collection('users')
    .where('is_deleted', '==', true)
    .get()

  console.log(docs)
}
catch (error) {
  console.log(error)
}

Первый возвращает снимки, и я могу записать документы

FIRST LOGS

User {"fname": "Steve", "is_deleted": true, "lname": "Kaspar", "name": "Steven Kaspar", "name_change_count": 2}
User {"fname": "Brian", "is_deleted": true, "lname": "Fitz"}


SECOND LOGS

[Error: [firestore/permission-denied] The caller does not have permission to execute the specified operation.]

1 Ответ

1 голос
/ 02 апреля 2020

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

Это нормальное поведение для onSnapshot: если запрошено документы находятся в кеше, они немедленно запускаются, а затем могут запускаться снова, если документы на сервере отличаются. А поскольку правила безопасности применяются только на сервере, первый обратный вызов всегда будет происходить, если в кеше есть данные.

A get() вызов с другой стороны немедленно пытается получить документ с сервера. И это в вашем случае отклоняет операцию чтения. Вы можете проверить это, выполнив команду get({ source: 'cache' }), которая будет считывать документы из кэша и, вероятно, будет успешной по той же причине, что и onSnapshot.

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

...