2017-10-05 2 views
0

firebase firestore에 일대 다 관계를 저장하고 싶습니다. 저자가 있고이 저자의 책이 있다고 가정 해 봅시다.firestore로 안전한 REST와 유사한 API 만들기

author/ 
    authorId1 : { 
    books: [{...}, {...}] 
    } 

그러나 나는 또한 바람직하게는 (AFAIK이 필요했다 실시간 DB에) 모든 저자를 반복하지 않고, 모든 책을 나열하는 방법이 필요합니다, 그래서 내가 가정하자 : 나는 중첩 된 관계를 저장할 수 해야합니까

author/ 
    authorId1 : { 
    books: [bookId1, bookId2] 
    } 
books/ 
    bookId1: {...} 
    bookId2: {...} 

보안 및 성능상의 이유로 나는 프론트 엔드를 필터링하지 않을 것입니다.

const bookRef = fireStore.collection('books'); 
debtorsRef.where('author', '==', authorId).then(...); 

이 잘하면 성능 문제를 제거하지만 클라이언트에서 다른 저자의 책을 가져올 수있을 것 이후로는 안전하지 : 나는 쿼리를 작성하는 것이 가능하다는 것을 발견했다. 게다가 필자는 저자의 문서에 관계를 저장하고 다른 방법으로는 저장하지 않을 것이다.

Django Rest Framework와 같은 편안한 API에서 주어진 사용자에게 속한 책만 반환하도록 쿼리를 제한 할 수 있습니다. IIUC는 IAM으로 가능하지만 예제를 기반으로 저는 어떻게 확신이 들지 않습니다.

다시 말해, 해당 id가 저자의 books 속성에 나열된 경우에만 책을 반환하고 싶습니다. 한 권의 책은 이론적으로 여러 저자에게 속할 수 있습니다.

나는 이것이 중복되어 많은 사람들이이 문제를 안고 있다고 생각하지만,이 특정 사례에 대한 명확한 답을 찾을 수 없었습니다.

답변

1

당신은 제대로 쿼리 확보 Security Rules을 작성할 수 있습니다 : 현재 우리는 평등에 대한 제약 (==)이 아니라 불평등 (!=, <, <= 등)

을 지원하는 것을

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /books/{bookId} { 
     allow read: if request.resource.data.author == resource.data.author 
    } 
    } 
} 

이 개념을 확장하여 각 책의 하위 모음에있는 소유자 목록을 유지 관리하고 존재 확인을 수행 할 수 있습니다 (). 다음과 같이 존재 확인을 수행하십시오 (exists() 함수 사용).

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /books/{bookId} { 
     allow read: if exists(/databases/$(database)/documents/books/$(bookId)/owners/$(request.auth.uid)) 
     match /owners/{ownerId} { 
     // Include other conditions that provide for ownership checks 
     allow write: if request.auth.uid == ownerId; 
     } 
    } 
    } 
} 
+0

잘 이해하면 현재 저자가 bookId를 가지고 있는지 확인할 방법이 없습니다. 각 도서가 여러 사용자에게 속할 수있는 다 대일 관계를 어떻게 표현 하시겠습니까? – fodma1

+0

이 정보를 포함하도록 답변을 업데이트했습니다. –