无法将安全规则条件基于 Firebase 中的资源数据
Unable to base security rule condition on resource data in Firebase
我正在尝试非常简单的事情,那就是在 Firebase 安全中将 request.auth.uid
与我的 交易 文档(例如 resource.data.useruid
)中的字段值匹配规则以获得特定登录用户的交易。但是,我在查询文档时没有得到任何文档,反而出现错误。
这就是集合的样子 - 只有一个文档有 useruid
字段。
该字段的值映射到用户 uid(屏幕截图取自 身份验证 -> 用户 选项卡。
规则看起来像这样
我应该取回一个文档,但每次我在该用户登录的情况下查询文档(我使用 angularfire2 用于这些目的)我得到 Error: Missing or insufficient permissions.
如果我将规则条件修改为 return 始终 true
或者如果我只检查 request.auth.uid
的真实性,我会得到正确的查询结果。有趣的是,涉及 resource.data
- 例如。检查 firebase 规则中 amount
字段的值 - 永远不会满足条件。我试着写成
allow read, write: if resource.data.amount == 3
又报错了。好像我根本没有得到 resource.data
地图。
我觉得我遗漏了一些明显的东西,虽然在阅读了指南之后,我觉得还好,我已经没有想法了。调试能力(或缺乏)使整个过程非常缓慢。
能否请您向我解释一下,为什么我没有在 firebase 安全规则中获取 resource.data
地图或指出可能存在问题的地方?
您很可能错过了文档中的一个特定点:您的查询失败 "because it does not include the same constraints as your security rules"。参见 https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_authuid
以下内容与您的安全规则完美配合:
firebase.auth().signInWithEmailAndPassword("xxxx@xxxx.com", "xxxxx")
.then(function (info) {
db.collection("transactions").where("userid", "==", info.uid).get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
});
});
如果您删除 where
子句,您将得到与您收到的完全相同的错误
我正在尝试非常简单的事情,那就是在 Firebase 安全中将 request.auth.uid
与我的 交易 文档(例如 resource.data.useruid
)中的字段值匹配规则以获得特定登录用户的交易。但是,我在查询文档时没有得到任何文档,反而出现错误。
这就是集合的样子 - 只有一个文档有 useruid
字段。
该字段的值映射到用户 uid(屏幕截图取自 身份验证 -> 用户 选项卡。
规则看起来像这样
我应该取回一个文档,但每次我在该用户登录的情况下查询文档(我使用 angularfire2 用于这些目的)我得到 Error: Missing or insufficient permissions.
如果我将规则条件修改为 return 始终 true
或者如果我只检查 request.auth.uid
的真实性,我会得到正确的查询结果。有趣的是,涉及 resource.data
- 例如。检查 firebase 规则中 amount
字段的值 - 永远不会满足条件。我试着写成
allow read, write: if resource.data.amount == 3
又报错了。好像我根本没有得到 resource.data
地图。
我觉得我遗漏了一些明显的东西,虽然在阅读了指南之后,我觉得还好,我已经没有想法了。调试能力(或缺乏)使整个过程非常缓慢。
能否请您向我解释一下,为什么我没有在 firebase 安全规则中获取 resource.data
地图或指出可能存在问题的地方?
您很可能错过了文档中的一个特定点:您的查询失败 "because it does not include the same constraints as your security rules"。参见 https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_authuid
以下内容与您的安全规则完美配合:
firebase.auth().signInWithEmailAndPassword("xxxx@xxxx.com", "xxxxx")
.then(function (info) {
db.collection("transactions").where("userid", "==", info.uid).get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
});
});
如果您删除 where
子句,您将得到与您收到的完全相同的错误