Правила безопасности облачного пожарного хранилища игнорируются при использовании функции onSnapshot - PullRequest
0 голосов
/ 24 сентября 2018

Мои роли безопасности игнорируются при использовании onSnapShot - я получаю все документы в коллекции и не только объекты пользователя.

роли:

service cloud.firestore {
match /databases/{database}/documents {

match /story/{mid} {

  function memberOf() {
    return resource.data.creator && request.auth.uid == resource.data.creator;
  }
  allow list: if request.query.limit <= 1000 &&
                 memberOf();
  allow get,read : if memberOf();
  allow write: if request.auth.uid == resource.data.creator;
  }
 }
}

, и мой код находится в реагирующем-собственном-firebase на Android: "act-native-firebase ":" ^ 4.3.8 "," com.google.firebase: firebase-firestore: 17.1.0 "

ctor: this.ref = firebase.firestore().collection('story');

componentDidMount() {
    this.unsubscribeDate = this.ref.onSnapshot(this.onCollectionUpdate);
}

componentWillUnmount() {
    this.unsubscribeDate();
}

onCollectionUpdate = querySnapshot => {
    //console.log('onCollectionUpdate', querySnapshot);
    querySnapshot.forEach(doc => {
        const { title, complete } = doc.data();
        console.log('onCollectionUpdate doc', title);
    });
};

справочные документы: доступ на основе ролей запрос ролей

1 Ответ

0 голосов
/ 14 июля 2019

Это поведение ошибка.Я получаю то же самое, используя javascript с PWA.

Я делал тесты и заметил, что проблема возникает при использовании постоянства в firestore.При использовании onSnapshot это выполняется 2 раза при его запуске, если я деактивирую постоянство firestore, ответ остается пустым, как и ожидалось, но при включенном постоянстве отображается результат кеша, затем выполняется обновление события onSnapshot,но так как чтение запрещено правилом в консоли Google, оно не обновляет результат с помощью события (onCollectionUpdate), поэтому вы читаете данные, которые не должны отображаться.

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

Чтобы напечатать ошибку на onSnapshot:

componentDidMount() {
    this.unsubscribeDate = this.ref.onSnapshot(this.onCollectionUpdate, this.onErrorUpdate);
}

onErrorUpdate = error => {
    console.log(error);
};
...