Firestore 安全规则 - 写入集合的权限有问题

Firestore security rules - trouble with permission to write to a collection

我试图设置一个安全规则,其中将文档写入特定集合的人只有在他们的 uid 与文档中包含的 uid 匹配时才能这样做,但无法使其工作。在这种情况下,我正在将文档写入一个名为 'embedUsers' 的集合,并且正在写入的文档包含一个在创建用户帐户时获取的 uid 字段。

规则设置如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {  
    match /embedUsers/{documents=**} {
      allow read: if true;
      allow write: if resource.data.uid == request.auth.uid;
    }
  }
}

该文档由 Angular 客户使用以下代码编写:

const userRef: AngularFirestoreDocument<UserModel> = this.afs.doc(`embedUsers/${user.accountAddress}`);
console.log("current logged in user", this.fireUser.uid);
try {
  console.log(user.uid);
  await userRef.set(user, { merge: true });
} catch (e) {
  console.error(`FireAuthService.updateUserData unexpected failure with error ${e.message}`)
  throw new Error("updateUserData failed");
}
console.log("wrote embed user successfully")

虽然我已经检查过登录用户的 uid 是否与正在写入的数据对象中的 uid 字段相匹配,但对 userRef.set 的调用失败并显示 FireAuthService.updateUserData unexpected failure with error Missing or insufficient permissions. 看来一定是出了什么问题使用我的规则,但我不确定是什么(如果我将规则更改为简单地说 allow write: if true; 文档将按预期编写。

doc 中所述,“写入数据时...... request.resource 变量包含文档的未来状态”。所以你应该调整你的规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {  
    match /embedUsers/{documents=**} {
      allow read: if true;
      allow write: if request.resource.data.uid == request.auth.uid;
    }
  }
}