【问题标题】:Firebase DB rules set to read only by ownerFirebase 数据库规则设置为所有者只读
【发布时间】:2020-02-28 09:31:05
【问题描述】:

我下载了一个简单的演示项目,我正在尝试做一些简单的更改。但我不知道如何设置数据库规则,以便只有创建项目的人才能打开与项目的链接。现在可以打开所有已登录的项目链接。

数据库规则文件:

{
  "rules": {
    ".read": "auth !== null",
    ".write":"auth !== null",
    "users": {
      "$uid": {
        ".write": "auth !== null && $uid === auth.uid",
        ".read": "$uid === auth.uid"
      }
    },
    "projects": {
      ".indexOn": ["createdBy"]
    }
  }
}

我想知道在"projects": 中添加行,例如".read": "createdBy === auth.uid",但它不起作用。如有任何帮助,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    一旦您授予用户对某个节点的读取或写入权限,他们就会对该节点下的所有数据拥有该权限。您不能在较低级别取消权限。在文档中,rules cascade 下提到了这一点。

    在您的规则的顶层,您授予用户此权限:

    ".read": "auth !== null",
    ".write":"auth !== null",
    

    鉴于上述解释,这意味着任何登录用户都具有对整个数据库的读/写访问权限。您在较低级别拥有的任何读/写规则都将被忽略。

    因此,您的第一步是删除这些顶级访问规则。


    接下来,您希望允许用户仅在创建该项目时才能阅读该项目。在规则中:

    "projects": {
      ".indexOn": ["createdBy"],
      "$projectid": {
        ".read": "auth.uid == data.child('createdBy').val()"
      }
    }
    

    有了这个,用户可以读取/projects/myproject,如果他们创建了myproject


    请注意,根据上述规则,没有用户可以读取/projects,因为您没有授予任何人对该节点的读取权限。 Firebase 安全不会代表您过滤任何数据,它们只是检查是否允许操作。有关这方面的更多信息,请参阅rules are not filters 上的文档。

    如果您希望用户能够运行查询以获取他们创建的所有项目,您需要做两件事:

    1. 只请求那些项目的查询。

      ref.orderByChild("createdBy").equalTo(uid)
      
    2. /projects 上的规则只允许该查询。

      "projects": {
        ".read": "auth.uid != null &&
                  query.orderByChild == 'createdBy' &&
                  query.equalTo == auth.uid"
      }
      

    所以现在你只允许读取/projects,当它完成一个只请求用户自己创建的项目的查询时。因此,安全规则和代码一起工作,以确保用户只获得他们有权读取的数据。

    有关最后一个主题的更多信息,请参阅query based rules 上的文档。

    【讨论】:

    • 但是我还有一个问题。当我尝试使用 ".read": "auth.uid == data.val().createdBy" 时,即使我在您的评论中修复了拼写错误(createBy),我也会收到错误 Error saving rules - Line 11: No such method/property 'createdBy'.
    • 试试data.child('createdBy').val()
    猜你喜欢
    • 2016-10-28
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2020-12-29
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多