消防站;安全规则模拟通过但实际失败(uid为map key)

Firestore; security rule simulation passes but actually fails (uid as map key)

我不明白为什么这个 Firestore 安全规则在 Web 中失败。

我正在使用 @angular/fire latest 查询集合,并使用 firebase latest,但它在模拟中有效。

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是"protected",那么我们看objname.objfield=="A"。 检查 access.code == "protected" 让我访问数据,但第二部分 objname.objfield == "A" 没有。

我不明白为什么。 我已确定此 属性 存在于集合的所有对象中。 ()

我尝试了几种不同的方式,它们都通过模拟,因为它是一个单一的文档查询。 集合级别的实际查询不会通过实际网络调用的权限。

这是我正在执行的查询,当没有适当的安全规则时该查询通过

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

这会是一回事吗?

感谢您的帮助

询问 Firebase 支持后,我被告知在查询上下文中,安全规则必须与查询本身相匹配。

也就是说;如果我想在 fieldA 和 fieldB 上使用过滤器查询文档,那么只有 fieldA 和 fieldB 应该在安全规则中。

然而,这不是我想要实现的。

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