使用Firebase,我如何获取一些节点,其中一些孩子是安全的?
例如......
数据结构:
root: {
clients: {
c1: {
data: {
name: "person1"
}
permissions: {
clientId: "abc"
trainerId: "123"
}
}
c2: {
data: {
name: "person2"
}
permissions: {
clientId: "def"
trainerId: "123"
}
}
}
}
安全性:
"clients": {
"$clientKey": {
"data": {
".read": "data.parent().child('permissions').child('clientId').val() == auth.token.name || data.parent().child('permissions').child('trainerId').val() == auth.uid",
".write": "data.parent().child('permissions').child('trainerId').val() == auth.uid"
}
}
}
所以我想要实现的目标如下:客户端可以读取自己的数据。培训师可以读写任何客户。如果id
位于permissions
,那么您可以按指定读/写。
但是,我的问题现在变成了,如果作为培训师,我想查看我有权阅读的所有客户的列表。
我如何获取客户端?试图在clients
上进行数据读取/获取失败。
答案 0 :(得分:1)
我会像这样构建你的数据库:
root: {
clients: {
abc: {
data: {
name: "person1"
},
trainer: {
123: true
}
},
def: {
data: {
name: "person2"
},
trainer: {
123: true
}
}
},
trainers: {
123: {
clients: {
abc: true,
def: true
}
}
}
}
遵守以下规则。 我认为在client_id对象上强制执行读写规则会更容易,如下所示:
{
"rules": {
"clients" : {
"$client_id" : {
".read": "auth.uid === $client_id || data.child('trainer/'+auth.uid).exists()",
".write" : "data.child('trainer/'+auth.uid).exists()"
}
},
"trainers": {
"$trainer_id": {
".read": "auth.uid === $trainer_id || data.child('clients/'+auth.uid).exists()",
".write": "auth.uid === $trainer_id"
}
}
}
}
要获得培训师的客户,您首先要获取培训师的节点,然后在客户端节点下获取每个客户端的客户端信息。
获取培训师下的所有客户的信息(我不知道Obj C,但我认为这应该有效。)
[[self.trainersRef child:[NSString stringWithFormat:@"%@/clients", userId]] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
for ( FDataSnapshot *child in snapshot.children) {
[[self.clientsRef child:[NSString stringWithFormat:@"%@/data", child.key]] observerEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull dataSnapshot) {
// Client info available here.
}];
}
}];