如何编写基于用户的安全性的实时数据库基本规则?

时间:2019-10-15 13:29:51

标签: firebase rest firebase-realtime-database

我正在尝试在Firebase实时数据库中实现基于用户的安全性。

作为一个基本示例,我希望经过身份验证的用户能够从“用户”节点读取/写入自己的数据。

我已经在Realtime DB规则模拟器中对此进行了测试,但读取以下参数失败:

Location: /users
Authenticated: true
Provider: Anonymous
UID: "aLoBLejDJ5P4PDZkZhe2LTxO8x32" (tried with and without quotation marks)

我收到了“模拟读被拒绝”的信息(尽管没有解释为什么)。 当我尝试读取REST HTTP GET请求(“错误:权限被拒绝”)时,也会发生同样的情况。

这是我的数据库结构:

{
  "users" : {
    "-LrAxMc5SANNe-p1Fd6n" : {
      "test" : "lol",
      "uid" : "aLoBLejDJ5P4PDZkZhe2LTxO8x32"
    }
  }
}

这是到目前为止的规则

{
  "rules": {
    "users" : {
      ".indexOn": "date",

      "$uid": {
        ".read" : "$uid === auth.uid",
        ".write" : "$uid === auth.uid",
      }
    }
  }
}

预期结果是在HTTP响应中获取该用户的数据,相反,我遇到了以上权限错误。

对于Firebase来说还很陌生,如果我理解/实现规则语法错误或其他原因,我不知道问题是什么。

我从注册中收到的HTTP响应中所接收到的uid(与上面在Firebase文档中看到的示例uid相比)也有很大不同,不知道这是否是问题的一部分?

我的应用程序中唯一的登录方法是当前的电子邮件地址和密码。

1 个答案:

答案 0 :(得分:0)

从您表达问题的方式来看,您似乎认为安全规则会自动过滤数据。事实并非如此:安全规则仅确保用户有权读取他们尝试读取的数据。当您附加侦听器时,就会发生这种情况,而这完全不是基于数据库中的实际数据。

有关此内容的更多信息,请参阅文档中的rules are not filters部分,先前的questions on the topic中的一些内容以及securely querying中的文档。


您正在尝试阅读/users。由于在我们的规则中没有人对该节点具有读取权限,因此数据库将拒绝读取操作。

要使用当前规则读取当前用户的数据,请从指向该用户数据的整个路径中进行读取:

/users/aLoBLejDJ5P4PDZkZhe2LTxO8x32

要允许从/users节点进行读取,您可以将规则修改为:

{
  "rules": {
    "users" : {
      ".indexOn": "date",
      ".read": "auth.uid != null",
      "$uid": {
        ".write" : "$uid === auth.uid",
      }
    }
  }
}

但这将允许任何人读取所有用户数据。