2017-11-29 6 views
0

나는 문서 모음을 가지고 있습니다. 각 문서에는 소유자에 대한 참조 인 자식 uid이 있습니다. 대표적인 문서 :사용자가 파이어베이스에서 읽을 권한이있는 문서 중에서 검색

내가 /documents 수집에서 보관 및 저장하고이를 검색 할 UID를 일치하는 사용자 만 허용 할
{ 
    "uid": "slfjs092320i3jf023jf", 
    "content": "Example" 
} 

. 다음과 같은 규칙을 만들었습니다 :

{ 
    "rules": { 
    "documents": { 
     "$documentId": { 
     ".read": "data.child('uid').val() === auth.uid", 
     ".write": "newData.exists() && newData.child('uid').val() === auth.uid || data.exists() && data.child('uid').val() === auth.uid", 
     ".indexOn": ["uid"] 
     } 
    } 
    } 
} 

유감스럽게도 사용자의 문서를 검색하려면 권한이 거부되었습니다. 문서를 검색하려면 다음을 사용하십시오.

export default getUserDocuments =() => { 
    const userUid = firebase.auth().currentUser.uid; 
    return firebase.database() 
     .ref('/documents') 
     .orderByChild('uid') 
     .equalTo(userUid) 
     .once('value'); 
}; 

사용자 문서를 어떻게 쿼리합니까? 거부 된 권한은 쿼리를 수행하는 데 필요한 읽기 제한과 관련이 있다고 생각합니다.

답변

0

Firebase 데이터베이스 리스너를 연결할 때 데이터베이스에 읽기 권한이 있습니다. /documents에서 읽을 수 있으려면 /documents에 대한 읽기 권한이 있어야합니다. 보안 규칙에는 해당되지 않으므로 청취자는 거부됩니다.

처음에는 반 직관적 일 수 있으며 보안 규칙을 사용하여 사용자가 시도하는 방식으로 데이터를 필터링 할 수 없음을 의미합니다. 설명서에 rules are not filters으로 알려져 있으며 many previous questions이라는 주제가 있습니다. 그 중 일부를 확인하고 질문이 있으면 다시보고하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다. 이 데이터를 저장하는 좋은 방법은 무엇입니까? 내 문서에도 범주가 있다고 가정 해보십시오. 두 개의 모음을 만들어야합니까? 구조 와 usersDocuments' '라는 이름의 한 { $의 UID : { 내용 : "예" } } , 구조 { $ 범주와 두 번째'documentsWithCategories' : { document1tId : 사실, document2Id : true } } ? –

+0

일반적으로 현재 구조로는 충족시킬 수없는 각 유스 케이스의 최상위 목록이 만들어집니다. 이러한 목록은 전체/부분 복제본이거나 단지 사용자 색인과 같은 수동 색인 일 수 있습니다. –