消防员;安全规则模拟通过,但实际上失败了(以uid作为映射密钥)

时间:2018-09-13 19:03:28

标签: firebase google-cloud-firestore angularfire2 firebase-security-rules

我不明白为什么此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"));
    }
  }
}

以下是数据:

enter image description here

如果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是在我开始使用规则后创建的。

这可以是一件事吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

询问Firebase支持后,有人告诉我在查询的上下文中,安全规则必须与查询本身匹配。

那是;如果我要使用fieldA和fieldB上的过滤器查询文档,则安全规则中应仅fieldA&fieldB。

但这不是我想要在这里实现的。

希望对遇到相同问题的人有所帮助。