数组中子项的 Firebase 安全规则
Firebase security rules for child items in arrays
我的 firebase 中有以下数据结构:
{
"groups" : {
"-KEFQ7rTQscPX4hqn6ec" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "Test",
"isPublic" : true,
"title" : "T1"
},
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"isPublic" : false,
"title" : "E"
}
}
并且正在努力实现以下目标:
- 每个人都可以阅读所有组 "isPublic" == true
- 只有登录用户才能看到他们创建的群组
我的第一个方法是:
{
"rules": {
"groups": {
".read": true,
"$id": {
".read": "data.child('isPublic').val() === true"
}
}
}
}
This Whosebug post 解释了为什么它不起作用,但我不知道如何让它起作用。
编辑 1:
This post 有 public/private 问题(我的第一个问题)的解决方案,但第二个问题没有。
编辑 2:
感谢@VonD 提供 public/private 问题的有效解决方案。
有了这个解决方案,public/private 的问题就解决了。考虑到私人群组有很多成员,他们的用户 ID 将存储在另一个数组中 "members" - 如果我是成员,我怎么才能只允许访问该群组?
"privateGroups": {
"b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"title" : "E",
"members": [userId1, userId2, userId3...]
}
}
}
您的文档结构无法实现所需的安全规则:如果您想表示给定用户可以阅读给定节点的某些子文档,则用户将只能使用它们的完整路径访问它们,例如 "groups/-KEFQao_Wd-Y-nLzIx2e",但他将无法检索符合给定条件的组列表(当然除非您在不同的路径上维护一个列表用户可以访问的组,这意味着您将为每个用户复制所有 public 个组 ID。
更适合 firebase 安全规则的文档结构是:
{
"publicGroups": {
"-KEFQ7rTQscPX4hqn6ec" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "Test",
"title" : "T1"
}
},
"privateGroups": {
"b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"title" : "E"
}
}
}
}
安全规则将很容易实施:
{
"publicGroups": {
".read": true
},
"privateGroups": {
"$userId": {
".read": "auth.uid === $userId"
}
}
}
希望对您有所帮助。
我的 firebase 中有以下数据结构:
{
"groups" : {
"-KEFQ7rTQscPX4hqn6ec" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "Test",
"isPublic" : true,
"title" : "T1"
},
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"isPublic" : false,
"title" : "E"
}
}
并且正在努力实现以下目标:
- 每个人都可以阅读所有组 "isPublic" == true
- 只有登录用户才能看到他们创建的群组
我的第一个方法是:
{
"rules": {
"groups": {
".read": true,
"$id": {
".read": "data.child('isPublic').val() === true"
}
}
}
}
This Whosebug post 解释了为什么它不起作用,但我不知道如何让它起作用。
编辑 1:
This post 有 public/private 问题(我的第一个问题)的解决方案,但第二个问题没有。
编辑 2:
感谢@VonD 提供 public/private 问题的有效解决方案。
有了这个解决方案,public/private 的问题就解决了。考虑到私人群组有很多成员,他们的用户 ID 将存储在另一个数组中 "members" - 如果我是成员,我怎么才能只允许访问该群组?
"privateGroups": {
"b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"title" : "E",
"members": [userId1, userId2, userId3...]
}
}
}
您的文档结构无法实现所需的安全规则:如果您想表示给定用户可以阅读给定节点的某些子文档,则用户将只能使用它们的完整路径访问它们,例如 "groups/-KEFQao_Wd-Y-nLzIx2e",但他将无法检索符合给定条件的组列表(当然除非您在不同的路径上维护一个列表用户可以访问的组,这意味着您将为每个用户复制所有 public 个组 ID。
更适合 firebase 安全规则的文档结构是:
{
"publicGroups": {
"-KEFQ7rTQscPX4hqn6ec" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "Test",
"title" : "T1"
}
},
"privateGroups": {
"b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"title" : "E"
}
}
}
}
安全规则将很容易实施:
{
"publicGroups": {
".read": true
},
"privateGroups": {
"$userId": {
".read": "auth.uid === $userId"
}
}
}
希望对您有所帮助。