2017-10-08 66 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,但仍然没有蛋糕。感谢您的链接!现在我将硬编码我允许的测试人员,并留意更新。 –