你如何观察一个没有覆盖下层孩子规则的上层孩子的快照?
Posted
技术标签:
【中文标题】你如何观察一个没有覆盖下层孩子规则的上层孩子的快照?【英文标题】:How can you observe a snapshot of a upper level child w/o overriding the lower child rules? 【发布时间】:2020-12-07 21:28:24 【问题描述】:JSON
"users" :
"02PdiNpmW3MMyJt3qPuRyTpHLaw2" :
"Coordinates" :
"latitude" : -24.809620667034363,
"longitude" : 28.321706241781342
,
"Education" : "6", ........./// here are 10 Childs further on same level as education
"Music"
现行规则
"rules":
".read": false,
".write": false,
, "users":
"$uid":
"Education" :
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
据我了解,如果我让用户为授权用户阅读规则,它将覆盖教育规则。下面是需要用户阅读规则的地方
let artist = Database.database().reference().child("users").queryOrdered(byChild: "music").queryStarting(atValue:dateToday.timeIntervalSince1970*1000)
artist.observe(DataEventType.value, with: snapshot in
更新:我在规则中有一个拼写错误“用户”
【问题讨论】:
您的 JSON 和代码中有users
,但您的规则中有 people
。此外,您订购的 music
属性不在 JSON 中。您能否编辑问题以确保这些都匹配,并且您查询的值存在于 JSON 中。
【参考方案1】:
一般来说,规则确实是,如果您授予某人对某个节点的读(或写)访问权限,那么他们对该节点下的所有数据具有相同的访问权限。所以你不能只在/people
上说".read": true
,因为这会让他们读取整个节点。
你可以做的是specify what query is allowed in your security rules。因此,要让每个人都能读取具有给定 music
值的所有节点,您可以这样做:
"baskets":
".read": "query.orderByChild == 'music' &&
query.equalTo > 1354867200000"
这里有几点要记住:
我在这里对其进行了硬编码,但您必须以某种方式根据now
variable 计算规则中过滤器的值。
您只能过滤单个值,因此您不能同时过滤music
和uid
。您可以将这两个值合并到一个属性中并对其进行排序/过滤。有关更多信息,请参阅:Query based on multiple where clauses in Firebase
【讨论】:
我想,如果我重写一些代码以减少篮下的孩子数量,那可能会奏效。但不是equalTo,它如何适用于我的示例。我试过了:".read": "auth.uid != null && query.orderByChild == 'music' && query.startAt(1444)"
但得到了错误:类型错误:Function call on target that is not a function
那就是query.startAt == 1444
。
它仍然失败。我对其进行了测试,当我将auth.uid != null
和auth.uid != null
与&& query.orderByChild == 'music'
一起使用时它成功了,但是如果我添加&& query.startAt == 9999 "
,它就会失败。那当然是当音乐孩子大于 9999 时。我检查它是更大的,但权限失败
如果查询在该条件下失败,则您没有传递startAt(9999)
。真的没有太多其他可以发生的事情了。
认为这可能是字符串与数字的问题。如果音乐孩子比9999
大,startAt(9999)
应该成功吧?以上是关于你如何观察一个没有覆盖下层孩子规则的上层孩子的快照?的主要内容,如果未能解决你的问题,请参考以下文章