1

我对Firebase安全性感到困惑。这里为什么...Firebase安全 - 共享数据

例如;我有以下数据库:

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

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

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

因此客户端A,B和C可以看到他们的私人数据。但是训练师A只能看到客户A和B的细节(他不训练C)。

我遇到的问题是,您似乎无法请求所有客户端的示例,但只返回那些使用安全规则结帐的客户端。正如文档所述,如果列表中的某个返回false,那么整个团队都会这样做。

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

回答

0

与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") 
} 

此一)检查用户进行身份验证和b)查看是否客户端是客户的名单培训师或者这是否是客户。

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

+0

感谢您的建议。我尝试了几乎与此相同的东西,但会放弃它。如果有一位客户是'trainerA'没有的话,这肯定会失败吗?如果规则在任何支票上返回false,则整个结果为零,对不对? –

+0

是的,它应该。这是未经测试的,因此您的情况可能无法在当前状态下运行。这就是说,至少应该让你在概念上接近你所需要的东西。 – dstepan

+0

我很欣赏这个想法。我怎么可能在'clients'上请求所有数据,并且它只是返回那些通过安全性的数据呢? –

0

你应该像添加客户端到培训师的朋友一样。创建一个包含培训师的共享节点作为孩子,培训师将包含A客户端密钥及其数据。

+0

感谢您的回应。这不会以很多重复的数据结束吗? –

+0

复制数据将是一种简单的方法,这也是Firebase工程师所建议的。你应该看看firebase提供的示例聊天应用程序的json文件。复制保持数据非规范化,而不是将大量数据保存在单个节点内,这需要花时间加载并且会影响应用程序的实时性能 –