Firebase 数据库规则和 permission_denied 错误

Firebase database rules and permission_denied error

我有一个具有以下规则的 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 文档,我的结构看起来与给出的示例相同。拜托,有人能告诉我这有什么问题吗?

请注意:将读取规则上移到 "messages" 下确实可以解决问题,但这不是我想要的解决方案,因为我想根据消息数据(类似于写入规则)编写一次规则我有基本规则。我想以这样的规则结束:

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

您在 /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 获取用户消息的密钥,然后获取每条消息。