【问题标题】:Firebase read rules based on data key基于数据键的 Firebase 读取规则
【发布时间】:2017-08-30 09:37:45
【问题描述】:

我的数据采用以下结构:

writings: {
    'xxx-key-xxx': {
        'user-id': 'xxxxx',
        'title': 'title',
        'content': 'content'
    }
}

我正在尝试只允许用户读取他的文档:

{
  "rules": {
    "writings": {
        ".read": "auth !== null && (root.child('writings').child('user-id').val() === auth.uid)",
        }
    }
}

但这不起作用。我怀疑我没有正确安装孩子user-id 键。有什么想法吗?

【问题讨论】:

  • 什么不起作用?你能显示你不想工作的代码吗?反之亦然:无法读取的代码,您希望能够读取吗?
  • 我在 firebase 控制台中进行模拟,但它被拒绝了。我有存储的数据,uid 设置为模拟器中使用的 UID,但它无法读取。
  • 模拟的路径是/writings/。我想获取用户拥有的所有作品。
  • 您打算如何查询此位置 (/writings)?查询按child排序并等于用户id?

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


【解决方案1】:

您将auth.uid 与路径/writings/user-id 的值进行比较,后者缺少键xxx-key-xxx,因此这将始终为假,因为此路径中的数据不存在。您可以更改您的规则以获取孩子的密钥,但是,这将限制您的 .read 读取个人 writings 孩子的权限,例如

{
  "writings": {
    "$wid": {
      ".read": "auth !== null && root.child('writings/$wid/user-id').val() === auth.uid"

或等效

      ".read": "auth !== null && data.child('user-id').val() === auth.uid"
    }
  }
}

使用这些规则,您将在尝试阅读 /writings 时看到 Permission Denied - 您必须单独阅读文档,因此您必须知道每个文档的密钥。现在我们知道我们需要的只是每个文档的键,我们需要找到一种方法来检索它们。

表示这种关系的一种常用方法是散开数据。我们有用户的uid,我们想要他们拥有的文档的密钥。如果您要维护另一个根节点来存储每个用户文档的密钥,只有他们可以访问,那么您可以参考该位置来检索用户的文档。

{
  "user-writings": {
    "$uid": {
      ".read": "auth.uid === $uid",
      "$wid": {
        ".write": "auth.uid === $uid"
      }
    }
  },
  "users": {
    ...
  },
  "writings": {
    "$wid": {
      ".read": "auth.uid === data.child('user-id').val()",
      ".write": "auth.uid === newData.child('user-id').val()"
    }
  }
}

这些规则确保用户只能查看他们自己的文档,因为他们只能访问他们在user-writings/$uid 中的文档密钥。当用户创建文字时,他们还需要写入user-writings/$uid/$wid,并将值设置为true

现在要检索属于用户的文档,您将使用用户的 uid 查询位置 user-writings/$uid 以检索密钥,然后必须获取用户拥有的每个 writings/$wid 的数据。完全放弃writings 并将每个用户的文档存储在数据库中的相应位置(user-writings/$uid)可能适合您。

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 2018-03-19
    • 2020-05-28
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多