【问题标题】:Firebase indexOn security & rules not workingFirebase indexOn 安全和规则不起作用
【发布时间】:2016-06-03 01:53:36
【问题描述】:

我在 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 
})

【问题讨论】:

  • 请添加触发错误的代码。
  • 我已经用触发错误的代码编辑了问题
  • 请不要将布尔值存储为字符串"-KB422VV21cPzpgi1wF1" : "true"

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


【解决方案1】:

对于任何使用 JSQMessages / Firebase 收到类似安全警告的人,您都可以使用它。

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

【讨论】:

    【解决方案2】:

    您正在尝试在数组上添加索引,这在 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
    

    【讨论】:

    • 我之前试过,但一直显示同样的错误,我不太明白为什么
    • 啊等一下,您正在尝试在数组上添加索引。这行不通。
    • 这实际上是我构建数据的方式。我已经用整个 JSON 数据结构更新了我的问题。由于取决于登录的用户,我无法查找用户的组:ref.childByAppendingPath("users/rsenov/groups"),因为用户更改
    • 更新了我的答案。请从现在开始发布一个完整的问题。这些往返不是很有效。
    • 如果您将用户动态添加到组中,您还需要为每个用户添加一个索引。有关这些索引的正确形式,请参阅我的答案的最新 sn-p。
    猜你喜欢
    • 2016-09-29
    • 2018-01-30
    • 1970-01-01
    • 2018-11-05
    • 2020-08-24
    • 2021-12-24
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多