exists()函数在Firestore安全规则中找不到任何文档



所以我有一个followers集合和一个users集合。在followers集合中创建具有特定ID的单据需要在users集合中存在具有相同ID的单据。

因此,在安全规则中,我检查该文档的存在。

match /followers/{followers} {
function loggedInUserMatching() {
return (request.auth != null) && (request.auth.uid == followers);
}
function userExistsAndLoggedIn() {
return loggedInUserMatching() && exists(/databases/$(database)/documents/users/$(request.auth.uid));
}
allow create, delete: if userExistsAndLoggedIn();
}

在测试中,我尝试在followers中创建一个文档,而不在users集合中创建相应的文档。这应该会失败。

const database = testEnv.authenticatedContext('user1').firestore();
let testFollowersDoc = database.collection("followers").doc("user1");
expect(assertFails(testFollowersDoc.set({followers: []}))).resolves.toBeDefined();

然后,我在users集合中创建文档,然后再次尝试在followers中创建文档。这应该成功,但总是失败。

const testUserDoc = database.collection("users").doc("user1");
testUserDoc.set({about: "Wow", following: []});
expect(assertSucceeds(testFollowersDoc.set({followers: []}))).resolves.toBeUndefined();

users集合的create规则是正确的,并且实际创建了文档。我可以访问它的数据并验证它是否存在。但在我的安全规则中,exists()函数总是返回false,因此权限被拒绝,文档也不会创建。

这可能是什么原因造成的?我是否错误地使用了exists()函数?或者我在测试中没有正确创建文档?

我已经尝试解决这个问题很长时间了,所以任何帮助都将不胜感激!

这些行是异步的,应该有await

expect(assertFails(await testFollowersDoc.set({followers: []}))).resolves.toBeDefined();
expect(assertSucceeds(await testFollowersDoc.set({followers: []}))).resolves.toBeUndefined();

最新更新