【问题标题】:Firebase: How to enable users to decide on the privacy of their data?Firebase:如何让用户决定他们数据的隐私?
【发布时间】:2017-02-10 18:01:27
【问题描述】:

假设用户在/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"
  }
}

这可以正常工作,但不幸的是,当 private/$userId.Value 一起观察时,shareData 的更改不会引发事件。因此,如果其他用户在隐私发生变化之前已经观察到这条路径,他仍然会看到缓存在持久性数据存储中的数据,这不应该是这种情况。当shareDatafalse 时,所有数据都应该对其他人隐藏。

如何做到这一点?

编辑: 刚刚发现一旦数据被读取,无论shareData是否被设置为false,观察者总是会返回缓存的数据。当应用程序重新启动时也会发生这种情况。

编辑 2: 仔细考虑之后,我得出的结论是,如果回调返回“权限被拒绝”错误,则可以轻松解决此问题。

【问题讨论】:

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


    【解决方案1】:

    我想我找到了一个合理的解决方法/解决方案:

    像这样在/private/$userId 中嵌入shareData

    - 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"会产生和之前一样的效果:如果有缓存数据,就会显示出来。

    【讨论】:

    • 上面的一些规则是无效的。正如您在编辑中指出的那样,规则级联:如果您在父级中授予权限,则不能在子级中撤销它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2015-09-03
    • 2018-12-08
    相关资源
    最近更新 更多