首页 > 解决方案 > Firestore 规则获取始终为空或出错

问题描述

它是关于 isAllowedWorkDayLocationData (检查 user-document.teamId 和 WorkDayLocationData.teamId 是否相同) - 全局读取似乎工作正常,并且 users{users} 似乎工作。

我尝试比较访问文档的属性 .teamId 和请求者 /users/-Document .teamId。

不知何故,它总是返回错误或错误,我不确定两者中的哪一个......我检查了两个文档并给出了teamId。

rules_version = '2';
service cloud.firestore {

  
  function isAllowedWorkDayLocationData(docId, userUid) {
  return 
    get(/databases/{database}/documents/users/$(userUid)).data.teamId == 
    get(/databases/{database}/documents/workDayLocationDatas/$(docId)).data.teamId;
  }  
  
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
    }
    
    match /workDayLocationDatas/{docId} {
      allow write: if isAllowedWorkDayLocationData(docId, request.auth.uid);
    }
    match /users/{user} {
      allow write: if request.auth.uid != null;
    }
  }
}

这是我来自 Angular 应用程序的查询(在我实施规则之前一直有效)


this.afStore.collection<WorkDayLocationData>('workDayLocationDatas', ref => ref
        .where('teamId', '==', this.teamId)
        .where('locationId', '==', this.locationId)
        .where('date', '==', this.helpers.toFireStoreDate(this.workDay.date))
        .limit(1))
        .snapshotChanges()
        .pipe(first())
        .subscribe((actions: DocumentChangeAction<WorkDayLocationData>[]) => {
          console.log("i did something");
          const data = actions[0].payload.doc.data() as WorkDayLocationData;
          const id = actions[0].payload.doc.id;
          const newPersonUids = [...data.slotsPersonUids, user.uid];
          this.afStore.collection<WorkDayLocationData>('workDayLocationDatas')
            .doc(id)
            .update({
              slotsUsed: newPersonUids.length,
              slotsPersonUids: newPersonUids
            });
        });
    });

属性的 WorkDayLocationData 接口:


export interface WorkDayLocationData {
    date: string;
    locationId: string;
    locationName: string;
    teamId: string;
    slotsUsed: number;
    maxSlots: number;
    slotsPersonUids: string[];
}

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


function isAllowedWorkDayLocationData(docId, userUid) {
  return 
    get(/databases/{database}/documents/users/$(userUid)).data.teamId == 
    get(/databases/{database}/documents/workDayLocationDatas/$(docId)).data.teamId;
  }  

所以事实证明 {database} 应该是 $(database) ,因此该函数的正确代码如下所示:

  function isAllowedWorkDayLocationData(docId, userUid) {
  return 
    get(/databases/$(database)/documents/users/$(userUid)).data.teamId == 
    get(/databases/$(database)/documents/workDayLocationDatas/$(docId)).data.teamId;
  }  

推荐阅读