Firestore规则未按预期工作

问题描述 投票:0回答:1

我在firestore上设置了以下规则。

service cloud.firestore {
  match /databases/{database}/documents {
    match /items/{itemid} {
        allow read, write: if request.auth.uid == resource.data.owner;
    }
  }
}

在我的Angular服务中,我正在初始化集合,如下所示:

constructor(private authService: AuthService, private fs: AngularFirestore) {
  this.itemsCollection = this.fs.collection('items', cr => {
    return cr.where('owner', '==', authService.currentUserId);
  });
}

读取项目的代码:

items() {
  return this.itemsCollection.valueChanges();
}

编写项目的代码:

addItem(item: ItemEntry): Observable<DocumentReference> {
  item.owner = this.authService.currentUserId;
  return Observable.fromPromise(this.itemsCollection.add(item));
}

读取操作正常,但写入操作(addItem)失败并出现错误

权限丢失或不足。

无法弄清楚,为什么?

angular firebase google-cloud-firestore firebase-security
1个回答
2
投票

那是因为resource变量:

包含存储在resource.data文档中的字段和值的映射。

这意味着resource.data仅包含已存储在数据库中的数据。

你应该使用request.resource代替。因为它包含写入数据库的数据。您的新规则如下所示:

allow read, write: if request.auth.uid == request.resource.data.owner;
© www.soinside.com 2019 - 2024. All rights reserved.