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



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

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"一样向"projects":添加行,但它不起作用。我会感谢你的帮助。

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

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

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

根据上面的解释,这意味着任何登录的用户都可以对整个数据库进行读/写访问。您在较低级别上的任何读/写规则都将被忽略。

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


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

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

这样,如果用户创建了myproject,则可以读取/projects/myproject


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

如果你想让用户能够运行一个查询,获得他们创建的所有项目,你需要两件事:

  1. 一个只请求这些项目的查询。

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

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

因此,现在只允许在使用只请求用户自己创建的项目的查询完成/projects的读取。因此,安全规则和代码协同工作,以确保用户只获得他们被授权读取的数据。

有关最后一个主题的更多信息,请参阅有关基于查询的规则的文档。

最新更新