Firebase数据库规则和permission_denied错误

时间:2017-08-30 01:36:54

标签: firebase firebase-realtime-database firebase-authentication firebase-security

我有一个Firebase数据库,其中包含以下规则:

{
  "rules": {
    "messages": {
      "$message": {
        ".read":  "true",
        ".write": "newData.child('uid').val() === auth.uid"
      }
    }
  }
}

数据结构如下所示:

enter image description here

我可以毫无问题地写信给它,但是当我尝试阅读时,我收到以下错误:

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"
      }
    }
  }
}

1 个答案:

答案 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获取用户留言的密钥,然后获取每封邮件。