使用 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;
}
}
}
我的代码在Android上的react-native-firebase中: "React-native-firebase": "^4.3.8", "com.google.firebase:firebase-firestore:17.1.0">
克托: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);
});
};
参考文档: 基于角色的访问 角色查询
此行为是一个错误。我得到同样的结果,将javascript与PWA一起使用。
我正在做测试,我注意到在 firestore 中使用持久性时出现问题。使用 onSnapshot 时,启动时会执行 2 次,如果我停用 firestore 的持久性,答案是空的,正如预期的那样,但在启用持久性的情况下会显示缓存的结果,然后执行 onSnapshot 事件的更新,但由于读取被谷歌控制台中的规则拒绝, 它不会通过事件 (onCollectionUpdate( 更新结果,因此您正在读取不应显示的数据。
当以前缓存中有数据时会发生这种情况,如果这是第一次在设备中使用应用程序,则该规则可以完美运行,因为以前缓存中没有数据。我认为这种行为是一个错误,因为它应该尊重规则,即使有缓存,因为它知道它试图限制文档的读取。
要在快照上打印错误,请执行以下操作:
componentDidMount() {
this.unsubscribeDate = this.ref.onSnapshot(this.onCollectionUpdate, this.onErrorUpdate);
}
onErrorUpdate = error => {
console.log(error);
};