我下载了一个简单的演示项目,我正在尝试进行一些简单的更改。但是我无法弄清楚如何设置数据库规则,因此只有有人创建了项目才能打开与项目的链接。现在可以打开所有登录的人的项目链接。
数据库规则文件:
{
"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"
添加行,但是这行不通。感谢您的帮助。
一旦授予用户对节点的读写权限,他们就对该节点下的所有数据都具有该权限。您不能在较低级别取消许可。在文档中的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上的文档。
如果您希望用户能够运行查询以获取他们已创建的所有项目,则需要做两件事:
仅查询那些项目的查询。
ref.orderByChild("createdBy").equalTo(uid)
/projects
上的一条规则,仅允许该查询。
"projects": {
".read": "auth.uid != null &&
query.orderByChild == 'createdBy' &&
query.equalTo == auth.uid"
}
因此,当查询仅请求用户自己创建的项目时,只允许读取/projects
。因此,安全规则和代码可以共同确保用户仅获得他们有权读取的数据。
有关此最后一个主题的更多信息,请参见query based rules上的文档。