2017-10-08 71 views
2

我正試圖創建一個允許用戶在列表上進行協作的應用程序。每個用戶都需要被邀請才能在列表中工作。Firestore數據庫用戶之間共享文檔的規則和結構

我這樣構建了我的數據(鬆散地基於this blog post)。 也可以根據需要更改此結構。

list 
    list_1: 
    users: 
     owner: 
     [email protected]: true 
     shared: 
     [email protected]: true 
     [email protected]: true 
    id 
    name 
    items: 
     item_1: 
     id: 
     name: 
     ... 

我想實現的目標:每個人都應該能夠創建列表。他們的創建者然後成爲創建列表的所有者。 只有「共享」文檔中的所有者和用戶應該能夠讀取和寫入此列表。

我想權限設置應該看起來像這樣。但這是行不通的:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /lists/{listId}/{anything=**} { 
     allow read, write: if !exists(resource.data.users.owner) || 
           resource.data.users.owner == request.auth.token.email || 
           request.auth.token.email in resource.data.users.shared 
    } 
    } 
} 

回答

2

我能弄明白。

我改變了數據結構這一點:

list 
    list_1 
    owner: [email protected] 
    writeAccess: [[email protected], [email protected]] 
    id 
    name 
    items: 
     item_1: 
     id: 
     name: 
     ... 

然後,像這樣的數據庫規則工作:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /lists/{listId} { 
     // Allow RW on lists for owner, shared user or for everyone if it's a new list 
     allow read, write: if resource.data.owner == request.auth.token.email || 
          request.auth.token.email in resource.data.writeAccess || 
          !exists(/databases/$(database)/documents/lists/$(listId)) 
    } 
    match /lists/{listId}/items/{itemId} { 
     // Allow RW on item for owner or shared user of parent list 
     allow read, write: if get(/databases/$(database)/documents/lists/$(listId)).data.owner == request.auth.token.email || 
           request.auth.token.email in get(/databases/$(database)/documents/lists/$(listId)).data.writeAccess || 
          !exists(/databases/$(database)/documents/lists/$(listId)) // Needed for new lists. Because lists and items are created in a batch 
    } 
    } 
} 
+0

如果使用寫訪問列表這樣的分享,你怎麼了然後查詢一個用戶的所有列表?在這裏他們表示,如果您使用數組,則無法獲得包含類別cat的所有帖子:https://firebase.google.com/docs/firestore/solutions/arrays。你是如何解決這個問題的? –

+0

@TheOddler您說得對,使用此解決方案無法查詢一個用戶的所有列表。爲了使這成爲可能,您可以將用戶的ID存儲爲映射鍵。這也是您發佈的鏈接中的建議。不幸的是,點不允許作爲地圖鍵。所以電子郵件地址將不起作用。還有一個基於地圖的權限已知的問題。請參閱:https://stackoverflow.com/q/46674372/2837489 –

+0

感謝您的答案!這就解釋了爲什麼它不起作用。我雖然在地圖上使用了uid,但仍然沒有蛋糕。感謝您的鏈接!現在我將硬編碼我允許的測試人員,並留意更新。 –