【发布时间】:2022-01-16 10:09:58
【问题描述】:
我有一个集合UserActivity,其中每个docId 都是用户的ID。在不同的docIds 下,我有子集合profileVisit 我想在其中放置一些数据我的firebase 规则,应该允许only 创建操作。也就是说,用户只有在登录并拥有该资源的情况下才能在Useractivity/{userId}/profileVisit 下创建子集合。所以我的firebase规则如下:
match /UsersActivity/{userId} {
match /profileVisit {
allow create: if userIsAuthenticated() && userOwnsResource(userId);
}
}
function userIsAuthenticated () {
return request.auth.uid != null;
}
function userOwnsResource (userId) {
return request.auth.uid == userId
}
也就是说,应该允许以下操作:
firebase
.firestore()
.collection("UserActivity")
.doc(uid)
.collection("profileVisit")
.add({
data: "some data",
});
我写的测试如下:
it("Users can create subcollection profileVisit under their own UsersActivity document if they are signed in", async () => {
const db = getFirestore(auth);
const userDoc = db
.collection("UsersActivity")
.doc(myId)
.collection("profileVisit");
await firebase.assertSucceeds(userDoc.add({ data: "data" }));
});
此测试失败:FirebaseError: 7 PERMISSION_DENIED: false for 'create'
谁能向我解释为什么我的测试失败了?我的规则写对了吗,还是测试写错了?
编辑
似乎将规则更改为:
match /UsersActivity/{userId} {
match /profileVisit/{id} {
allow create: if userIsAuthenticated() && userOwnsResource(userId);
}
}
让我的测试通过。那就是我把match /profileVisit改成了match /profileVisit/{id} {,谁能解释一下为什么会有区别,为什么我需要在最后加上{id}?
【问题讨论】:
-
代码 sn-p 中的
.uid是什么?它是如何初始化的? -
对不起,我的意思是
.doc(uid)。它只是uid,我发布它是为了说明。我想我发现了我的“错误”......第二个嵌套规则应该是match /profileVisit/{id},也就是说我需要添加{id},即使我没有在规则中使用它? -
你在做某事。调查一下,让我们知道。 :)
标签: javascript firebase google-cloud-firestore firebase-security