【问题标题】:Firebase Security - Shared DataFirebase 安全 - 共享数据
【发布时间】:2017-03-07 16:05:49
【问题描述】:

我对 Firebase 安全感到困惑。这就是为什么...

例如;我有以下数据库:

clients: {
    $key: {
        //client data
    }
}

trainer: {
    $key: {
        //trainer data
    }
}

我需要一个客户能够看到他们自己的信息。我需要一位培训师才能看到他们所有客户的信息,而不是其他培训师。

因此客户 A、B 和 C 可以看到他们的个人隐私数据。但是培训师 A 只能看到客户 A 和 B 的详细信息(他不培训 C)。

我遇到的问题是,您似乎无法请求所有客户端,而只能返回使用安全规则结帐的客户端。正如文档所述,如果列表中的一个返回 false,则整个列表都会返回。

如何创建正确的结构和安全规则?

【问题讨论】:

    标签: ios objective-c firebase firebase-realtime-database firebase-security


    【解决方案1】:

    您应该暗示一些事情,例如将客户添加到培训师作为朋友。创建一个包含 trainer 作为子节点的 sharedwith 节点,并且 trainer 将包含 A 和 B 客户端密钥及其数据。

    【讨论】:

    • 感谢您的回复。但这不会以大量重复数据结束吗?
    • 复制数据将是一种简单的方法,这也是 Firebase 工程师的建议。您应该查看 firebase 提供的示例聊天应用程序的 json 文件。复制使数据保持非规范化,而不是将大量数据保存在单个节点中,这将需要时间来加载并会影响应用程序的实时性能
    【解决方案2】:

    类似于 Firebase 文档 (https://firebase.google.com/docs/database/security/user-security) 中的示例,这可能对您有用。

    我认为您的结构至少可以从客户和培训师之间的直接关键联系中受益。像

    clients: {
       clientA: {
           trainerKey: "trainerA"
       }
    }
    
    trainers: {
       trainerA: {
          clients: { clientA: true, clientB: true }
       }
    }
    

    安全规则 - 已编辑以包含用户

    "clients": {
        ".read": "auth !== null && (root.child('trainers/' + $trainerKey + '/clients').child($uid).exists() || auth.uid == $uid")
    }
    

    这 a) 检查用户是否已通过身份验证,并且 b) 查看客户端是否在培训师的客户端列表中,或者这是否是客户端。

    这是未经测试的,但希望能让你到达你想要去的地方。我还假设您的客户 ID 与他们的身份验证 ID 相同。

    【讨论】:

    • 感谢您的建议。我已经尝试过与此几乎相同的东西,但会试一试。如果有trainerA 没有的客户端,这肯定会失败吗?如果规则在任何检查中返回 false,则整个结果为 nil,对吗?
    • 是的,应该。这是未经测试的,因此对于您的情况,它可能无法在当前状态下工作。也就是说,至少在概念上应该让你接近你需要的东西。
    • 我很欣赏这个想法。我怎么可能在clients 请求所有数据,但它只返回那些通过安全性的数据?
    • 如果我没看错的话,你就是一名培训师,你只关心你的客户。为什么您需要拉动所有客户端(考虑您的应用程序的扩展),而不是您知道已经与培训师绑定的客户端?
    • 嗯,我这么说的唯一原因是,如果我将所有培训师客户都放在数据库中该培训师之下,那么客户将无法查看他们的个人数据。这就是为什么我认为将所有客户端都放在一个节点下,也许是错误的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多