Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用函数onSnapshot时忽略云firestore安全规则_Javascript_Firebase_Google Cloud Firestore_Firebase Security_React Native Firebase - Fatal编程技术网

Javascript 使用函数onSnapshot时忽略云firestore安全规则

Javascript 使用函数onSnapshot时忽略云firestore安全规则,javascript,firebase,google-cloud-firestore,firebase-security,react-native-firebase,Javascript,Firebase,Google Cloud Firestore,Firebase Security,React Native Firebase,使用onSnapShot时,我的安全角色被忽略-我将获取集合中的所有文档,而不是仅获取用户对象 角色: service cloud.firestore { match /databases/{database}/documents { match /story/{mid} { function memberOf() { return resource.data.creator && request.auth.uid == resource.data.creator

使用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;
  }
 }
}
参考文件:
这种行为是一个错误。我得到了同样的结果,使用javascript和PWA

我在做测试,发现在firestore中使用持久性时会出现问题。当使用onSnapshot时,启动它时会执行2次,如果我停用firestore的持久性,则答案是空的,正如预期的那样,但在启用持久性的情况下,会显示缓存的结果,然后会执行onSnapshot事件的更新,但由于google控制台中的规则会拒绝读取,它不会通过事件(onCollectionUpdate)更新结果,因此您正在读取不应显示的数据

当以前缓存中有数据时,如果是第一次在设备中使用应用程序,则会发生这种情况,因为以前缓存中没有数据,所以该规则工作正常。我认为这种行为是一个错误,因为它应该遵守规则,即使是缓存,知道它试图限制文档的读取。 要在onSnapshot上打印错误,请执行以下操作:

componentDidMount(){
this.unsubscribeDate=this.ref.onSnapshot(this.onCollectionUpdate,this.onErrorUpdate);
}
OneErrorUpdate=错误=>{
console.log(错误);

};
您似乎认为安全规则将过滤数据,只返回您有权访问的文档。事实并非如此:Firebase安全规则从不过滤数据,它们只是检查读取操作是否只能访问允许的数据。要保护查询,请参阅。这意味着我希望您的
This.ref.onSnapshot(This.onCollectionUpdate)
总是失败,所以我不确定您为什么要取回所有文档。您的安全规则是保护故事下文档的子集合中的文档,但您的代码只查询故事下的文档,而不是子集合中的文档。谢谢,@Dougvanpoffelen,我更改了规则并删除了{documents=**},但它仍然没有过滤,我得到了所有的集合。@Frankvanpoffelen,那么为什么我要得到集合中的所有文档呢?解决了,这是“react native firebase”4.3.8版中的一个巨大安全漏洞。升级到5.0.0版后-我收到一个错误。
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);
    });
};