我们假设用户在/private/$userId
中存储了一些私人数据,他们可以与他人共享或不共享。该决定应存储在/privacySettings/$userId/shareData
Bool
中。如果用户将其值设置为true
,则其他人应该能够读取私有数据。
我已启用persistance
并尝试使用服务器规则解决此问题:
"private": {
".read": false,
".write": false,
"$userId": {
".read": "auth != null && root.child('privacySettings/' + $userId + '/shareData').val() === true",
".write": "auth != null && auth.uid == $userId"
}
}
这样可以正常使用,但遗憾的是,shareData
中的更改不会在使用private/$userId
观察.Value
时引发事件。因此,如果其他用户在隐私更改之前已经观察到此路径,他仍将看到在持久性数据存储中缓存的数据,但情况并非如此。当shareData
为false
时,所有数据都应隐藏给其他人。
怎么做?
修改
刚刚发现,一旦读取了数据,观察者将始终返回缓存的数据,无论shareData
是否已设置为false
。当应用程序重新启动时也会发生这种情况。
编辑2: 在进一步思考之后,我得出的结论是,如果回调给出了“拒绝许可”错误,这个问题很容易解决。
答案 0 :(得分:0)
我想我找到了一个合理的解决方法/解决方案:
将shareData
嵌入/private/$userId
中,如下所示:
- private
- $userId
- shareData // Bool
- data // contains private data
即使有缓存data
,也可以根据shareData
的值轻松隐藏它,而无需观察另一个节点。
服务器规则:
"private": {
".read": false,
".write": false,
"$userId": {
".read": "auth != null", //(*)
".write": false,
"shareData": {
".write": "auth != null && auth.uid == $userId",
".read": "auth != null",
},
"data": {
".read": "auth != null && root.child('private/' + $userId + '/shareData').val() === true",
".write": "auth != null && auth.uid == $userId",
}
}
}
修改强>
似乎标有(*)
的行会覆盖子规则...使用"data.child('shareData').val() === true"
会产生与以前相同的效果:如果有缓存数据,则会显示。