Firebase indexOn security& amp;规则不起作用

时间:2016-02-21 18:25:14

标签: swift firebase firebase-security firebase-realtime-database

我在xcode中遇到此错误:

使用未指定的索引。考虑在/ groups中添加“.indexOn”:“members / rsenov”到您的安全规则以获得更好的性能

这是我的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 
})

2 个答案:

答案 0 :(得分:4)

您正尝试在阵列上添加索引,这在Firebase中是不可能的。

正如错误消息告诉您的那样(令人惊讶的准确),您需要为members/rsenov添加索引:

{
  "rules": {
    ".read": true,
    ".write": true,
    "groups": {
      "$group_id": {
        ".indexOn": "members/rsenov"
      }
    }
  }
}

但这意味着你需要为每个用户添加一个索引,这是非常低效的。这就是推荐非规范化的原因。

作为替代方案(我在answer to your last question中推荐),您可以自己创建一个自定义索引,这个过程称为非规范化。

{
  "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

答案 1 :(得分:1)

对于使用JSQMessages / Firebase获得类似安全警告的任何人,您都可以使用此功能。

{
"rules": {
    ".read": true,
    ".write": true,
    "typingIndicator": {
    ".indexOn": ".value"
  }
}
}