1

Firebase Security에 대해 혼란스러워합니다. 여기 왜 ...Firebase 보안 - 공유 데이터

예를 들어; 다음 데이터베이스를 가지고 있습니다 :

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

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

자신의 정보를 볼 수있는 클라이언트가 필요합니다. 모든 고객의 정보를 볼 수 있도록 트레이너가 필요하지만 다른 트레이너는 볼 수 없습니다.

그래서 클라이언트 A, B 및 C는 개인 데이터를 볼 수 있습니다. 그러나 트레이너 A는 클라이언트 A와 B의 세부 정보 만 볼 수 있습니다 (그는 C를 교육하지 않습니다).

내가 만나는 문제는 모든 클라이언트를 요청할 수는 없지만 보안 규칙을 사용하여 체크 아웃 한 클라이언트 만 반환 할 수 있다는 것입니다. docs 상태에서 목록에있는 객체가 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") 
} 

이 a)는 사용자가 인증되었는지 확인하고 b)는 클라이언트가 클라이언트의 목록에 있는지 본다 트레이너 또는 이것이 클라이언트인지 여부.

테스트되지 않았지만 시도하려는 위치로 이동하게됩니다. 또한 클라이언트 ID가 인증 ID와 동일한 것으로 가정합니다.

+0

제안 해 주셔서 감사합니다. 나는 이것과 거의 같은 것을 시도해 왔지만 그것을 줄 것이다. 확실히 'trainerA'가 가지고 있지 않은 클라이언트가 있다면 이것이 실패 할 것입니다. 어떤 체크에서 규칙이 거짓을 반환하면 전체 결과는 nil입니다. 맞습니까? –

+0

네, 그래야합니다. 이것은 테스트되지 않았으므로 귀하의 경우 현재 상태에서는 작동하지 않을 수 있습니다. 즉, 최소한 개념적으로 필요한 것에 가까이 다가 가야합니다. – dstepan

+0

나는 그 아이디어에 감사한다. 어떻게하면 '클라이언트'에서 모든 데이터를 요청할 수 있으며 보안을 통과 한 데이터 만 반환합니까? –

0

당신은 트레이너에게 친구로 클라이언트를 추가하는 것과 같은 것을 함축해야합니다. 자식으로 트레이너가 포함 된 공유 노드를 만들고 트레이너에는 & B 클라이언트 키와 해당 데이터가 포함됩니다.

+0

답변 해 주셔서 감사합니다. 이 중복 데이터의 많은 끝내지 않을까요? –

+0

데이터를 복제하는 것은 쉬운 접근법이며 firebase 엔지니어가 제안한 것이 있습니다. firebase가 제공하는 예제 채팅 응용 프로그램의 json 파일을 살펴보아야합니다. 복제는 단일 노드 안에 많은 양의 데이터를 보관하는 것이 아니라 데이터를 비정규 적으로 유지하므로로드하는 데 시간이 걸리고 앱의 실시간 성능에 영향을 미칩니다 –