Firebase DB规则设置为所有者只读

Firebase DB规则设置为所有者只读,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我下载了一个简单的演示项目,我正在尝试做一些简单的更改。但我不知道如何设置DB规则,这样只有创建项目的人才能打开与项目的链接。现在可以打开项目链接所有登录的人 数据库规则文件: { "rules": { ".read": "auth !== null", ".write":"auth !== null", "users": { "$uid": { ".write": "auth !== null && $uid === au

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

数据库规则文件:

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

我想知道如何在
“项目”中添加行:
类似于
”.read:“createdBy===auth.uid”
,但它不起作用。我将非常感谢您的帮助。

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

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

".read": "auth !== null",
".write":"auth !== null",
根据上述解释,这意味着任何登录用户都具有对完整数据库的读/写访问权限。您在较低级别拥有的任何读/写规则都会被忽略

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


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

"projects": {
  ".indexOn": ["createdBy"],
  "$projectid": {
    ".read": "auth.uid == data.child('createdBy').val()"
  }
}
有了它,如果用户创建了
myproject
,则可以读取
/projects/myproject


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

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

  • 仅请求这些项目的查询

    ref.orderByChild("createdBy").equalTo(uid)
    
  • 关于
    /projects
    的规则,只允许该查询

    "projects": {
      ".read": "auth.uid != null &&
                query.orderByChild == 'createdBy' &&
                query.equalTo == auth.uid"
    }
    
  • 因此,现在您只允许在仅请求用户自己创建的项目的查询中读取
    /projects
    。因此,安全规则和代码协同工作,以确保用户只获得授权读取的数据


    有关最后一个主题的更多信息,请参阅。

    上的文档,但我还有一个问题。当我试图使用
    “.read”:“auth.uid==data.val().createdBy”
    我得到了错误
    错误保存规则-第11行:没有这样的方法/属性“createdBy”。
    即使我在你的评论中修复了打字错误(createBy)数据.child('createdBy').val()