我尝试创建的规则只允许用户创建/编辑request.auth.uid
与他们尝试创建的文档名称相匹配的文档。来自https://cloud.google.com/firestore/docs/security/secure-data:
使用来自通配符的变量
使用带有通配符的数据库路径匹配规则时,a 使用与您包含的字符串匹配的名称创建变量 在大括号内。然后,您可以在中引用这些变量 你的安全规则。
这些类型的通配符的一个常见用途是存储文档 userID,然后只允许用户访问他们的文档 userID匹配文档的ID。
service cloud.firestore { match /databases/{database}/documents { match /users/{userIDFromWildcard}/ { // Users can only edit documents in the database if the documentID is // equal to their userID allow read, write: if request.auth.uid == userIDFromWildcard; } } }
我尝试在我的规则中使用此代码,但它出错了。删除最后一个/
,即match /users/{userIDFromWildcard}
而不是match /users/{userIDFromWildcard}/
时,会发布,但如果文档不存在,则不会授予权限。
编辑:我也试过这样的事情,但由于缺乏文档,我不知道如何正确地做到这一点:
allow read, write: if request.auth.uid == request.resource.__name__;
这是我正在运行的代码insufficient permissions
:
this.items = afs.doc("/users/" + this.uid); // afs is AngularFirestore, this.uid is the uid of the authenticated user
...
// the user is authenticated at this point
this.items.snapshotChanges().subscribe(snapshot => {
if (!snapshot.payload.exists) { // if user isn't in db
function recursive() {
// ...
this.updateDB(); // called once because of conditional
}
recursive();
} else {
// ...
}
}
updateDB
:
public updateDatabase(): void {
const changes: Item = { name: this.name, username: this.username,
photoURL: this.photoURL };
this.items.set(changes).then((item) => { // causes error
console.log("Saving successful");
}, (err) => {
console.log(err);
}).catch((err) => {
console.log(err);
});
}
答案 0 :(得分:0)
您可能需要此文档设置:
service cloud.firestore {
match /database/{databases}/documents {
match /users/{userId}/{document=**} {
allow read, write: if request.auth.uid == userId;
}
}
}
此外,如果您需要写入子集,请参阅this answer
有关firestore here
中的通配符匹配的更多信息