我正在尝试根据登录用户从Firebase中的实时数据库检索数据。
我在Firebase中的节点如下所示:https://prnt.sc/kpdoq9 我的规则是这样设置的:
{
"rules": {
"userhours": {
"$uid": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
}
}
当我尝试通过我的方法检索数据时:
loadUserHours() {
firebase
.database()
.ref("userhours")
.once("value")
.then((data) => {
const obj = data.val();
console.log(obj)
})
},
我得到一个Error: permission_denied at /userhours
我认为这与规则有关
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
因为“主内部节点”不是实际的uid(已登录用户ID),而是由Firebase生成的随机密钥?我的结构应该是什么样的?
我假设当将Firebase节点设置为userhours/{uidhere}/..
时,规则正在路径userhours/{randomKeyGeneratedByFirebase}/..
中寻找一个uid
答案 0 :(得分:0)
Firebase数据库安全规则不会为您过滤数据。相反,它仅在附加数据时检查是否允许侦听器访问数据。
当用户将侦听器附加到/userhours
时,Firebase数据库服务器将检查他们是否对该节点具有读取权限。由于您仅授予/userhours/$uid
的读取权限,因此没有人拥有/userhours
的读取权限,并且读取被拒绝。
您将需要将侦听器附加到/userhours/$uid
。所以:
firebase
.database()
.ref("userhours")
.child(firebase.auth().currentUser.uid)
.once("value")
.then((data) => {
const obj = data.val();
console.log(obj)
})