我下载了一个简单的演示项目,我正在尝试做一些简单的更改。但我不知道如何设置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安全不会代表您过滤任何数据,他们只是检查是否允许操作。有关此方面的更多信息,请参阅有关规则不是筛选器的文档。
如果你想让用户能够运行一个查询,获得他们创建的所有项目,你需要两件事:
一个只请求这些项目的查询。
ref.orderByChild("createdBy").equalTo(uid)
/projects
上只允许该查询的规则。"projects": { ".read": "auth.uid != null && query.orderByChild == 'createdBy' && query.equalTo == auth.uid" }
因此,现在只允许在使用只请求用户自己创建的项目的查询完成/projects
的读取。因此,安全规则和代码协同工作,以确保用户只获得他们被授权读取的数据。
有关最后一个主题的更多信息,请参阅有关基于查询的规则的文档。