【问题标题】:Firebase realtime database - Wildcard rulesFirebase 实时数据库 - 通配符规则
【发布时间】:2021-12-12 00:48:03
【问题描述】:

我对 firebase 规则有点困惑。这是我的实时数据库。 “1”内的每个节点都是使用用户的 Firebase 唯一 ID 创建的。并且在用户的节点中有一个对象列表。

目标是让用户能够在该节点不存在的情况下创建该节点,并允许用户仅在该节点内进行读/写。

我试过这个,但它不起作用。我得到权限错误。

{
  "rules": {
    "1": {
      "$key": {
        ".read": "auth != null && auth.uid == $key",
        ".write": "auth != null && auth.uid == $key"
      }
    }
  }
}

注意:以后还会有其他父节点(“2”、“3”等),所以保持“1”很重要。另外,以防万一,我正在使用 firebase 匿名登录。

感谢您的帮助。

更新:

我像这样检索installationId:

Task<String> getIdTask = FirebaseInstallations.getInstance().getId()

并像这样访问数据库:

FirebaseDatabase.getInstance()
                .getReference()
                .child("1")
                .child(installationId)

尝试使用上面的代码访问数据库会得到:

Listen at /1/cKYZwWrlRmSof79rtfuX82 failed: DatabaseError: Permission denied

解决方案: 我才意识到我的错误的严重性。检索我正在使用的用户 ID

FirebaseInstallations.getInstance().getId()

Firebase 将其视为 userId:

FirebaseAuth.getInstance().getCurrentUser().getUid();

使用后者解决了这个问题。

【问题讨论】:

  • 规则本身还没有做任何事情。您能否显示产生错误的最小代码,并在其中通过记录当前用户的 UID 来显示您的代码满足您的规则条件。
  • @FrankvanPuffelen 感谢您的回复。我更新了帖子以包含我的代码和错误日志
  • @FrankvanPuffelen 没关系,我才意识到我做错了什么。规则很好,我只是在代码中使用了错误的键。当我在帖子中复制代码时我意识到了这一点,所以谢谢你让我这样做:P
  • 很高兴听到您发现了问题! ???我投票结束这个问题,因为它是一个错字/短暂的问题。

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


【解决方案1】:

除非您添加另一个节点,它实际上将 UID 与您的用户 ID 链接起来,否则它怎么知道呢?我建议重新考虑结构并完全摆脱那个多余的节点;只需使用 UID。并不是说不可能通过 UID 查找值……但这可能是一种不幸的数据库设计,它忽略了给定的环境。

【讨论】:

  • 您的意思是代表用户的节点是数据库中的父节点吗?在这种情况下,我发布的规则会起作用吗?
  • 通常更容易接受 Firebase 使用 UID 而不是整数 ID 的事实......并且当节点具有 UID 的名称时,更容易编写规则 - 因为其他任何事情都需要在其中查找条件(这也稍微减慢了请求,大约是毫秒,但是当它是关于可以避免的处理时,我会去做)。
猜你喜欢
  • 2017-04-30
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2020-08-08
相关资源
最近更新 更多