Firebase indexOn 安全和规则不起作用
Firebase indexOn security & rules not working
我在 xcode 中遇到此错误:
使用未指定的索引。考虑将 ".indexOn": "members/rsenov" at /groups 添加到您的安全规则以获得更好的性能
这是我的 JSON 数据结构:
{
"groups" : {
"-KB422VV21cPzpgi1wF1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 1"
},
"-KB423lni1Iptn2fGwi1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 2"
},
"-KB48kVOz4yTfdE86Ub7" : {
"author" : "senovi",
"members" : {
"senovi" : true
},
"name" : "Asd"
}
},
"users" : {
"rsenov" : {
"email" : "rsenov",
"groups" : {
"-KB422VV21cPzpgi1wF1" : true,
"-KB423lni1Iptn2fGwi1" : true
},
"name" : "Ruben",
},
"senovi" : {
"email" : "senovi",
"groups" : {
"-KB48kVOz4yTfdE86Ub7" : true
},
"name" : "Rubén ",
}
}
}
这是我到目前为止在安全规则中所做的:
{
"rules": {
".read": true,
".write": true,
"groups": {
"$group_id": {
".indexOn": "members"
}
}
}
}
这是触发错误的代码:
DataService.dataService.GROUPS_REF.queryOrderedByChild("members/\(DataService.dataService.CURRENT_USER_ID)").queryEqualToValue(true).observeEventType(.Value, withBlock: { snapshot in
//some code
})
您正在尝试在数组上添加索引,这在 Firebase 中是不可能的。
正如错误消息告诉您的那样(它非常准确),您需要为 members/rsenov
添加索引:
{
"rules": {
".read": true,
".write": true,
"groups": {
"$group_id": {
".indexOn": "members/rsenov"
}
}
}
}
但这意味着您需要为每个用户添加一个索引,这是非常低效的。这就是推荐反规范化的原因。
作为替代方案(我在 中推荐),您可以自己创建自定义索引,这个过程称为非规范化。
{
"groups" : {
"-KB422VV21cPzpgi1wF1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 1"
},
"-KB423lni1Iptn2fGwi1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 2"
}
},
"users": {
"rsenov": {
"groups": {
"-KB422VV21cPzpgi1wF1": true,
"-KB423lni1Iptn2fGwi1": true
}
}
}
}
使用此数据结构,您甚至无需查询即可查找用户的组:
ref.childByAppendingPath("users/rsenov/groups")
.observeEventType(.Value, withBlock: { snapshot in
或者,如果您想使用当前经过身份验证的用户:
ref.childByAppendingPath("users")
.childByAppendingPath(ref.authData.uid)
.childByAppendingPath("groups")
.observeEventType(.Value, withBlock: { snapshot in
对于使用 JSQMessages / Firebase 收到类似安全警告的任何人,您可以使用它。
{
"rules": {
".read": true,
".write": true,
"typingIndicator": {
".indexOn": ".value"
}
}
}
我在 xcode 中遇到此错误:
使用未指定的索引。考虑将 ".indexOn": "members/rsenov" at /groups 添加到您的安全规则以获得更好的性能
这是我的 JSON 数据结构:
{
"groups" : {
"-KB422VV21cPzpgi1wF1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 1"
},
"-KB423lni1Iptn2fGwi1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 2"
},
"-KB48kVOz4yTfdE86Ub7" : {
"author" : "senovi",
"members" : {
"senovi" : true
},
"name" : "Asd"
}
},
"users" : {
"rsenov" : {
"email" : "rsenov",
"groups" : {
"-KB422VV21cPzpgi1wF1" : true,
"-KB423lni1Iptn2fGwi1" : true
},
"name" : "Ruben",
},
"senovi" : {
"email" : "senovi",
"groups" : {
"-KB48kVOz4yTfdE86Ub7" : true
},
"name" : "Rubén ",
}
}
}
这是我到目前为止在安全规则中所做的:
{
"rules": {
".read": true,
".write": true,
"groups": {
"$group_id": {
".indexOn": "members"
}
}
}
}
这是触发错误的代码:
DataService.dataService.GROUPS_REF.queryOrderedByChild("members/\(DataService.dataService.CURRENT_USER_ID)").queryEqualToValue(true).observeEventType(.Value, withBlock: { snapshot in
//some code
})
您正在尝试在数组上添加索引,这在 Firebase 中是不可能的。
正如错误消息告诉您的那样(它非常准确),您需要为 members/rsenov
添加索引:
{
"rules": {
".read": true,
".write": true,
"groups": {
"$group_id": {
".indexOn": "members/rsenov"
}
}
}
}
但这意味着您需要为每个用户添加一个索引,这是非常低效的。这就是推荐反规范化的原因。
作为替代方案(我在
{
"groups" : {
"-KB422VV21cPzpgi1wF1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 1"
},
"-KB423lni1Iptn2fGwi1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 2"
}
},
"users": {
"rsenov": {
"groups": {
"-KB422VV21cPzpgi1wF1": true,
"-KB423lni1Iptn2fGwi1": true
}
}
}
}
使用此数据结构,您甚至无需查询即可查找用户的组:
ref.childByAppendingPath("users/rsenov/groups")
.observeEventType(.Value, withBlock: { snapshot in
或者,如果您想使用当前经过身份验证的用户:
ref.childByAppendingPath("users")
.childByAppendingPath(ref.authData.uid)
.childByAppendingPath("groups")
.observeEventType(.Value, withBlock: { snapshot in
对于使用 JSQMessages / Firebase 收到类似安全警告的任何人,您可以使用它。
{
"rules": {
".read": true,
".write": true,
"typingIndicator": {
".indexOn": ".value"
}
}
}