我不明白为什么此Firestore安全规则在网络中失败。
我正在将@ angular / fire最新用于集合查询和最新的Firebase,但它可以在模拟中使用。
service cloud.firestore {
match /databases/{database}/documents {
// Match any document in the 'cities' collection
match /events/{event} {
allow read: if (resource.data.access.code == 'public' || (resource.data.access.code == 'protected' && resource.data.objname.objfield == "A"));
}
}
}
以下是数据:
如果access.code是“受保护的”,那么我们看objname.objfield ==“ A”。 检查access.code ==“ protected”可以访问数据,但是第二部分objname.objfield ==“ A”不可以。
我不明白为什么。 我已确保该属性存在于集合的所有对象中。(Firestore security rules based on map values)
我尝试了几种不同的方法,它们都通过了Simulation,因为它是单个文档查询。 收集级别的实际查询不会通过实际的网络调用获得权限。
这是我正在执行的查询,当没有适当的安全规则时,该查询就会通过
const pathAccessCode: firebase.firestore.FieldPath = new firebase.firestore.FieldPath('access', 'code');
const eventsUser: AngularFirestoreCollection<any> = this.firestore.collection('events', ref => ref.where(pathAccessCode, '==', 'protected'));
const eventsUser$: Observable<any> = eventsUser.valueChanges();
eventsUser$.subscribe(data => console.log(data) );
如您所见;某些属性可以被规则(access.code)识别,而其他属性(objname.objfield)则不能识别。
在此阶段,我唯一想到的就是 access.code是在我开始使用规则之前创建的。 objname.objfield是在我开始使用规则后创建的。
这可以是一件事吗?
感谢您的帮助
答案 0 :(得分:1)
询问Firebase支持后,有人告诉我在查询的上下文中,安全规则必须与查询本身匹配。
那是;如果我要使用fieldA和fieldB上的过滤器查询文档,则安全规则中应仅fieldA&fieldB。
但这不是我想要在这里实现的。
希望对遇到相同问题的人有所帮助。