为什么此 Firebase 安全规则测试失败?
Why does this test for firebase security rule fails?
我有一个集合UserActivity
,其中每个docId
都是用户的id。在不同的 docId
s 下,我有子集合 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}
?
正如您在编辑中发现的那样,这没有任何作用:
match /UsersActivity/{userId} {
match /profileVisit {
allow create: if userIsAuthenticated() && userOwnsResource(userId);
}
}
match /profileVisit
与 profileVisit
集合相匹配,但其中没有文档,所以这是一个空洞。
要使其匹配任何文档,请使用:
match /UsersActivity/{userId} {
match /profileVisit/{docId} {
allow create: if userIsAuthenticated() && userOwnsResource(userId);
}
}
我有一个集合UserActivity
,其中每个docId
都是用户的id。在不同的 docId
s 下,我有子集合 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}
?
正如您在编辑中发现的那样,这没有任何作用:
match /UsersActivity/{userId} {
match /profileVisit {
allow create: if userIsAuthenticated() && userOwnsResource(userId);
}
}
match /profileVisit
与 profileVisit
集合相匹配,但其中没有文档,所以这是一个空洞。
要使其匹配任何文档,请使用:
match /UsersActivity/{userId} {
match /profileVisit/{docId} {
allow create: if userIsAuthenticated() && userOwnsResource(userId);
}
}