我正在构建一个React Native应用程序,并且刚刚开始构建我的Firestore数据库中的所有安全规则。我有几个很好的规则,但是有一个规则与给我的工作规则几乎相同
Error: Missing or insufficient permissions.
甚至更奇怪的是,当我在Firestore模拟器中测试此规则时,该规则通过了,没有任何问题。
我尝试将所有条件逻辑从函数推入规则本身,但是什么也没做。
以下是相关规则:
service cloud.firestore {
match /databases/{database}/documents {
function getCurrentTeam() {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.lastTeam;
}
function signedIntoTeam() {
// For context, all "like" documents have an associated teamId.
return request.auth.uid != null && getCurrentTeam() == resource.data.teamId;
}
match /likes/{like} {
allow read: if signedIntoTeam();
}
}
}
这是我的React Native应用中的错误函数:
const getLikes = posts =>
new Promise((resolve, reject) => {
const likedPosts = [];
if (!posts.length) return resolve(likedPosts);
posts.forEach(post => {
if (post.likeCount > 0) {
firebase
.firestore()
.collection('likes')
.where('postId', '==', post.id)
.where('userId', '==', firebase.auth().currentUser.uid)
.get()
.then(querySnapshot => {
const likedByUser = querySnapshot.size > 0;
likedPosts.push({ ...post, likedByUser });
if (likedPosts.length === posts.length) resolve(likedPosts);
})
.catch(err => reject(err));
} else {
likedPosts.push({ ...post, likedByUser: false });
if (likedPosts.length === posts.length) resolve(likedPosts);
}
});
});
我有非常相似的功能和规则,可以在其他地方正常工作。我似乎无法弄清楚为什么这个特别失败了。
答案 0 :(得分:0)
您的规则正在尝试根据文档B
字段的内容从D -> A -> B -> A
集合中筛选文档。如果您的查询也没有使用相同的条件进行过滤,则该规则将始终拒绝该请求。这是因为 security rules are not filters 。请阅读链接的文档。
有了适当的规则,客户端总是必须在likes
字段上进行过滤。目前,它只是在teamId
和teamId
上进行过滤。您应该在其中添加postId
,或更改规则以匹配查询。查询和规则需要同步-查询只能仅请求知道规则可读取的文档-它不应依赖规则对结果集进行更改。< / p>