我已经为我的Cloud Firestore数据库设置了规则,我无法弄清楚如何在以下调用中获取userId通配符。
第一个代码段有效,因为我在用户节点上搜索,文档Id(resource.id)与uid相同。
第二个代码段在写入例如users / uid / items / itemId时不起作用。在这种情况下,Resource.id将等于itemId,并且如下所示尝试映射通配符不起作用。我已根据Firebase规则文档尝试了request.path [6]和request.path [1],但成功了。
match /users/{user} {
allow read;
allow write: if request.auth.uid == resource.id; //WORKS LIKE A CHARM
}
match /users/{userId}/{document=**} {
allow read;
allow write: if request.auth.uid == request.path['userId']; //ALWAYS FAILS
}
编辑1: 例如,当我使用新项目的参数对/ users / 12dij1od / items / itemId进行POST时,我希望它能够通过用户12dij1od,而不是其他任何用户。截至目前,每个人都失败了。
我也试过“允许写:if request.auth.uid == userId”
我可能做错了什么想法?
编辑2:
如果有办法解决它声明所有嵌套集合,我也愿意这样做。类似的东西:
match /users/{userId} {
allow read;
allow write: if request.auth.uid == request.path['userId']; //ALWAYS FAILS
//Nested Subcollection
match /items/{item} {
allow read;
allow write: if request.auth.uid == [ACCESS TO USERID HERE];
}
答案 0 :(得分:0)
对于其他有相同问题的人,通过试验我得到了以下代码,但我确实有效:
match /users/{userId} {
allow read;
allow create;
allow update, delete: if request.auth.uid == resource.id;
function getUserId() {
return get(/databases/$(database)/documents/users/$(userId)).id
}
match /{document=**} {
allow read;
allow write: if getUserId() == request.auth.uid;
}
}