Angular Firestore 规则在 Firebase Firestore Rule Playground 内部工作,但不在 Angular/Fire 查询内部工作

Angular Firestore Rules Work inside of Firebase Firestore Rule Playground but not inside of Angular/Fire queries

如您所见,这对很多人来说都是一个问题。

Angular/Fire 程序包 returns 获取在 Firestore Rule Playground 中工作的请求的权限缺失或不足。

示例 1: 存储集合和字段。

这是模拟。

这是我的查询:

this.resultCol = this.afs.collection('messages', ref => ref.where('orderId', '==', this.id).orderBy('created', 'desc') );

这是错误:

来源:https://github.com/angular/angularfire/issues/1828

service cloud.firestore {
  match /databases/{database}/documents {
    
    match /users/{user} {
       allow create:  if request.auth != null;
    }
    match /messages/{message} {
    
    function isConvParticipant() {
      return request.auth.uid == request.resource.data.clientId || request.auth.uid == request.resource.data.ownerId;
    }
    
    function isLoggedAndExist() {
      return request.auth != null && exists(/databases/$(database)/documents/users/$(request.auth.uid));
    }
    
       allow get: if isLoggedAndExist();
       allow list: if isLoggedAndExist() && request.auth.uid == resource.data.clientId || request.auth.uid == resource.data.ownerId;
       allow create: if isLoggedAndExist() && isConvParticipant();
    }
  }
}

其他人也有错误: 资料来源:https://github.com/angular/angularfire/issues/2121

问题为什么在firestore模拟器中可以,但在实际操作中却不行

对于回答这个问题的任何人。

首先,request.auth 可能为空,因此您必须检查它,因为它会导致我们的 'missing' 权限出错。请检查 firestore 规则监控 - 这将告诉您不允许和错误之间的区别。您收到此消息的原因可能是“错误”,而不是因为不允许。

其次,确保用户已登录。您可以通过 authStateChanged 或 AngularFirestoreAuth.user observable 来做到这一点。

我发现我收到那条消息是因为出错了。那是因为经过身份验证的用户在 Firebase Admin 中不存在。