0

使用Firebase,我如何获取其中有些孩子安全的节点?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" 
       } 
      } 
     } 

所以我想实现如下;客户可以读取他们自己的数据。培训师可以阅读和编写他们的任何客户。如果您的idpermissions中,那么您可以按照指定进行读/写操作。

但是,我的问题现在变成了,如果作为培训师,我想查看我有权读取的所有客户端的列表。

我该如何取客户?试图在clients上执行数据读取/读取失败。

+0

做这些权限实际上你在模拟器工作?我无法让他们工作。 –

+0

不,不适合我。我在这里看到一个例子:https://firebase.googleblog.com/2016/10/group-security-in-firebase-database.html我明白它不是一个答案,我问的原因是因为我无法找出一个工作解决方案,或不知道它会如何工作。 –

回答

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. 
    }]; 
    } 
}]; 
+0

添加了对象C查询。 –