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



我试图设置一个安全规则,在这个规则中,只有当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;
}
}
}

最新更新