Firebase - 在没有安全节点的情况下获取数据?

时间:2017-03-08 18:29:46

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

使用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上进行数据读取/获取失败。

1 个答案:

答案 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.
    }];
  }
}];