Firebase:如何让用户决定其数据的隐私权?

时间:2016-10-02 19:12:14

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

我们假设用户在/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时引发事件。因此,如果其他用户在隐私更改之前已经观察到此路径,他仍将看到在持久性数据存储中缓存的数据,但情况并非如此。当shareDatafalse时,所有数据都应隐藏给其他人。

怎么做?

修改 刚刚发现,一旦读取了数据,观察者将始终返回缓存的数据,无论shareData是否已设置为false。当应用程序重新启动时也会发生这种情况。

编辑2: 在进一步思考之后,我得出的结论是,如果回调给出了“拒绝许可”错误,这个问题很容易解决。

1 个答案:

答案 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"会产生与以前相同的效果:如果有缓存数据,则会显示。