Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用基于firebase查询的规则保护数据(使用orderByChild和不可索引的密钥) 更新/答复2018年2月_Javascript_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

Javascript 使用基于firebase查询的规则保护数据(使用orderByChild和不可索引的密钥) 更新/答复2018年2月

Javascript 使用基于firebase查询的规则保护数据(使用orderByChild和不可索引的密钥) 更新/答复2018年2月,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,基于查询的规则目前似乎无法为realtimeDB结构提供这种级别的安全性/优雅性。类似这样的东西需要嵌套排序、变量“key”索引(与当前的“indexOn”:“.value”,或者firebase团队尚未想出的一些其他魔术 同时,我可以明确建议大家阅读基于查询的规则: 原始Q:给定一个firebase实时数据库节点列表,每个节点都有一个组的命名列表,以及一个我想查找的组-我希望通过基于查询的规则限制访问,以便仅返回具有给定组的节点。其他所有内容都应视为私有数据 例如DB: [looku

基于查询的规则目前似乎无法为realtimeDB结构提供这种级别的安全性/优雅性。类似这样的东西需要嵌套排序、变量“key”索引(与当前的
“indexOn”:“.value”
,或者firebase团队尚未想出的一些其他魔术

同时,我可以明确建议大家阅读基于查询的规则:


原始Q:给定一个firebase实时数据库节点列表,每个节点都有一个组的命名列表,以及一个我想查找的组-我希望通过基于查询的规则限制访问,以便仅返回具有给定组的节点。其他所有内容都应视为私有数据

例如DB:

[lookup]: {
  id1: {
    groups: {
      randomgroup1: true
    },
  },
  id2: {
    groups: {
      randomgroup1: true,
      randomgroup2: true
    },
  }
}
实时数据库规则:

"lookup": {
  ".read": "query.orderByChild != null && query.equalTo != null",
  "$uid": {
    ".indexOn": "groups"
  }
}
和有效的请求/查询:

const $group = 'randomgroup2';
firebase.ref('lookup').orderByChild(`groups/$group`).equalTo(true).once('value')
上面正确返回
id2:{groups:{randomgroup1:true,randomgroup2:true}
,但是由于组名上缺少索引,整个
[lookup]
节点被发送到客户端进行过滤,即数据不安全

如何最好地做到这一点以保持安全性?我愿意更改节点的结构,或更新安全规则


注意:这完全可以通过经过尝试和测试的多对多关系设置(即firebase暴力复制数据库101)实现,同样也可以(而且安全)使用上述技术,每个记录只需要一个组。

您当前的数据结构非常适合查找给定
id的组

但是要查找给定组的
id
s,您需要执行一个查询,正如您正在尝试的那样

对于要在服务器上执行的查询,您需要在您订购的字段上定义索引,因此
groups/$group
。这意味着您需要在每个
groups/randomgroup1
groups/randomgroup2
等字段上定义索引。这是不可行的

这就是为什么要向数据结构中添加另一个节点,该节点正好包含要查找的信息:每个随机组的
id
s:

[lookup2]: {
  randomgroup1: {
    id1: true
  },
  randomgroup2: {
    id1: true,
    id2: true
  }
现在,使用此结构,您还可以直接查找给定组的
id
s

有关此类双向查找的详细信息,请参阅:


一如既往地感谢Frank的洞察力。我想这里的目的是利用新的基于查询的规则来简化数据库的结构,也就是说,我意识到有一种蛮力的方法,但我追求的是优雅。例如,你可以
“indexOn”:“.value”
对于
orderByValue
查询-是否有一种方法来构造数据,以便可以使用
orderByValue
来代替
orderByChild
?尝试使用新技术将信封推到这里。无法定义一个索引,该索引为每个子节点提供多个值。这就是我如何记住可能的还有什么不好。酷,有道理。我想是蛮力。或者只允许一个团体