2016-06-17 3 views
1

사용자가 항목을 추가하고 자신의 항목 만 볼 수있는 groceryItem 앱을 사용하고 있습니다.
childByAutoId을 사용하여 항목을 추가하고 각 항목에 고유 한 키 항목을 가져옵니다 (그림 1 참조). enter image description hereFirebase 데이터베이스 규칙 개인 노드

각 항목에는 3 가지 속성이 있습니다. addedByUser은 인증 된 사용자의 UID이며 물론 이름과 수량입니다.

사용자 만 자신의 항목을 볼 수 있도록 규칙을 설정하는 데 문제가 있습니다. 내 현재 규칙은 다음과 같습니다 (그림 2 참조). enter image description here

다른 사용자와 로그인하면 모든 항목을 읽을 수 있습니다. 그래서 내 질문은 : 어떻게 그들을 만든 사용자가 읽을 수있는 항목을 만들 수 있습니까?

는 내가 사이의 childByAutoId을 가지고 있기 때문에 나는 itemsaddedByUser 사이의 간격을 가지고 생각합니다. 당신이 더 좋은 방법으로 이것을 구조화 할 수있는 해결책이나 요령이 있다면, pls는 나를 도울 수 있습니다.

미리 감사드립니다.

+0

나는 첫 번째 실패를 발견했다고 생각합니다. ".read 및 .write 규칙은 하향식에서 작동하며, 더 얕은 규칙을 무시하는 규칙은 더 얕습니다."는 https://firebase.google에서 설명합니다.observeEventType (.Value, withBlock : {snapshot in var newItems = [Item]() snapshot.children의 항목에 대한 데이터입니다. com/docs/database/security/securing-data # read_and_write_rules_cascade –

답변

1

$ addedByUser는 항목의 "중첩 된 하위 항목"이 아니기 때문에이 예제에서 잘못된 지점에 있지만 자식 항목의 특성입니다.

"items": { 
    "$item": { 
    ".read": "data.child('addedByUser').val() === auth.uid" 
    } 
} 

이것은 Firebase docs에서 올려진다 : 데이터와

:

{ 
    "messages": { 
    "message0": { 
     "content": "Hello", 
     "timestamp": 1405704370369 
    }, 
    "message1": { 
     "content": "Goodbye", 
     "timestamp": 1405704395231 
    }, 
    ... 
    } 
} 

의 I (이 테스트 한하지 않음) 당신의 라인을 따라 뭔가를 찾고있을 것이라고 제안 규칙이 될 수있다 :

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     // only messages from the last ten minutes can be read 
     ".read": "data.child('timestamp').val() > (now - 600000)", 

     // new messages must have a string content and a number timestamp 
     ".validate": "newData.hasChildren(['content', 'timestamp']) && newData.child('content').isString() && newData.child('timestamp').isNumber()" 
     } 
    } 

} }

잘못된 사용자가 다른 사용자의 (단수) 항목을 읽지 못하도록 방지하고 사용자 SZ825V ...가 "items/-KKTDD ..."에 대한 읽기를 수행하지 못하게합니다. 단, 사용자 SZ825V가 "항목"에 대한 읽기를 수행하려면 사용자가 자신의 문서 및 다른 사람의 문서를 읽으려고하기 때문에 읽기가 완전히 실패합니다. 이것은 원자 적 방식으로 행동하는 규칙을 가진 firebase의 중요한 개념입니다. 즉, 읽기의 일부가 실패하면 전체 읽기가 수행됩니다. 이 규칙을 적용하는 또 다른 방법은 규칙이 필터 역할을하지 않는다는 것입니다. 이것이 원하는 기능이라면 구조를 재정렬해야 할 수 있습니다.

{ 
    "users": { 
    "abcdef-user-id": { 
     "items": { 
     "fjeiwofjewio": { 
      "name": "apple", 
      "qty": "23" 
     } 
     } 
    }, 
    "ghijkl-user-id": { 
     "items": { 
     "regrewgreh": { 
      "name": "passionfruit", 
      "qty": "18" 
     } 
     } 
    } 
} 

및 보안 규칙이있을 수 있습니다 : 다음과 같은 예는 수

.. { 
    "users": { 
     "$userId": { 
      ".read": "auth.uid === $userId" 
     } 
    } 
    } 

위의 방법은 당신은 단지 사용자가 사용자 자신의 데이터 트리에서 항목을 읽을 수 있도록하려면 가정입니다 아무도 다른 사용자의 항목을 볼 수 없게됩니다. 다른 사용자가 다른 사용자의 항목 중 일부를 볼 수있게하려면 다른 접근 방식이 필요하며 이는 다른 SO 질문입니다.

+0

{ 인쇄 (항목) 하자 아이템 = 항목 (스냅 샷! FIRDataSnapshot 같은 항목) newItems.append (항목) }. 이제이 심판에 내 iOS 앱 메신저 호출 observeEvent에서 내가 읽을 캔트 아무것도 :( –

+0

이는 firebase 권한의 원자 성 때문입니다. "items"목록을 읽었을 때 읽기 실패 (즉, 다른 사용자의 항목을 읽으려고하기 때문에)가 실패하면 전체 읽기가 실패하므로 항목이 반환됩니다 아니 맡은 일. 규칙은 필터의 역할을하지 않습니다. 내 답변은 사용자의 항목을 읽고 다른 사용자가 읽을 수 없도록하고 항목 전체 목록을 읽지 못하게하는 것과 관련이 있습니다. 다른 구조가 적절할 수도 있는데, 나는 답을 추가 할 것이다. – richter

관련 문제