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

私はそうのようなあなたのDBを構築します:以下のルールで

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

Obj Cクエリが追加されました。 –

関連する問題