我想这样做,这样我就可以让经过身份验证的用户写入仅对该用户可读/写/可创建的集合。我正在使用最基本的Firestore设置。我的Firestore规则如下所示:
service cloud.firestore {
match /databases/{database}/documents {
match /{userId} {
allow read, write, create: if request.auth.uid == userId;
}
}
}
我假设这将阻止对数据库的读取/写入/创建,除非路径的初始部分与登录用户的UID匹配。
我的JavaScript代码如下:
function addSomeData(data) {
console.log( "Sending data with: ", user.uid, data );
db.collection(user.uid).add({ data })
.then(function(docRef) {
console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
console.error("Error adding document: ", error);
});
}
成功登录后,我肯定已正确设置了user.id。
以这种方式使用东西总是会在控制台中给我这个错误:
添加文档时出错:错误:缺少权限或权限不足。
如果我恢复到这样的原始规则,则说明文档已成功创建:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
我想做的是让每个集合都以登录用户的UID开头。因此,数据的样本形状可能是这样的:
/ax323/brty/data="Hello"
/ax323/98da/data="Goodbye"
/br981/ha31/data="No comment"
因此,ax323是Firebase中的UID,br981也是如此。 ax323有两个文档集合,而br981有一个。
问题是数据的“形状”吗?
我真的不了解{document=**}
在原始规则中的含义,以及我是否需要将身份验证规则转换为类似内容。
答案 0 :(得分:2)
在数据库规则中,您使用了match /users/{userId} {
此规则仅适用于对该特定路径进行数学计算的文档。
因此,如果您的文档路径为/ax323/brty/data
,则您的规则应类似于
service cloud.firestore {
match /databases/{database}/documents {
match /{userId}/{document=**} {
allow read, write, create: if request.auth.uid == userId;
}
}
}
也看着您的问题,当您提到
时,我无法理解brty
的含义。
/ax323/brty/data="Hello"
吗?