我有一个Firebase数据库,其中包含以下规则:
{
"rules": {
"messages": {
"$message": {
".read": "true",
".write": "newData.child('uid').val() === auth.uid"
}
}
}
}
数据结构如下所示:
我可以毫无问题地写信给它,但是当我尝试阅读时,我收到以下错误:
Error: permission_denied at /messages: Client doesn't have permission to access the desired data.
我已经阅读了firebase文档,我的结构与给出的示例相同。请问有人可以告诉我这有什么问题吗?
请注意:在“消息”下移动读取规则确实解决了问题,但不是我想要的解决方案,因为我想基于消息数据编写规则(类似于写规则)规则工作。我想最终得到这样的规则:
{
"rules": {
"messages": {
"$message": {
".read": "data.child('uid').val() === auth.uid",
".write": "newData.child('uid').val() === auth.uid"
}
}
}
}
答案 0 :(得分:1)
您在/messages/$message
定义的规则不会影响对/messages
的查询,并且由于您尚未向/messages
添加任何读取权限,因此您将获得权限被拒绝。
如果您想要检索单个用户发出的消息,请考虑重构数据以将用户的消息嵌套在其uid下,例如
{
"rules": {
"user-messages": {
"$uid": {
".read": "auth.uid === $uid",
"$mid": {
".write": "newData.child('uid').val() === $uid"
}
}
}
}
}
使用此结构,您可以检索用户拥有的所有邮件。如果您想要检索所有消息,那么您还需要将消息写入/messages
。您可以在此处存储消息数据,在/user-messages/$uid
中,您可以存储用户发布的每条消息的密钥。您可以使用多位置更新同时执行两次写入。
{
"messages": {
"a": { "uid": "0", ... },
"b": { "uid": "0", ... }
}
"user-messages": {
"0": {
"a": true,
"b": true
}
},
"users": {
"0": { ... }
}
}
在user-messages/$uid
获取用户留言的密钥,然后获取每封邮件。