我试图设置一个安全规则,在这个规则中,只有当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;
文档按预期编写)。
如文档中所述,"当写入数据时…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;
}
}
}