Firestore安全规则:在文档中的数组中搜索用户的id

时间:2017-10-19 17:18:54

标签: firebase google-cloud-firestore

首先,对不起我可怕的英语,这不是我的母语......

我正在使用Firestore数据库在Firebase中构建一个简单的应用程序。在我的应用中,用户是小组的成员。他们可以访问其他用户'数据。 为了不查询太多文档(每个用户一个,在组的文档的子集合中),我选择添加用户'组内文档中的数据。 这是我的小组的文件:

{
   "name":"fefefefe",
   "days":[false,false,false,false,true],
   "members":[
       {"email":"eee@ff.com","id":"aaaaaaaa","name":"Mavireck"}, 
       {"email":"eee2@ff.com","id":"bbbbbbbb","name":"Mavireck2"}, 
   ],
}

如果用户在群组中,如何检查安全规则? 我应该使用对象吗? 我真的不想为用户使用子集合,因为我会很快达到免费配额的限制......

感谢您的时间!

编辑: 谢谢你的回答。我会把它改成一个对象:      "会员":{uid1:{},uid2:{}}

2 个答案:

答案 0 :(得分:21)

通常,您需要编写如下规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{documentId} {
      // works if `members` = [uid1, uid2, uid3]
      // no way to iterate over a collection and check members
      allow read: if request.auth.uid in resource.data.members;
      // you could also have `members` = {uid1: {}, uid2: {}}
      allow read: if resource.data.members[request.auth.uid] != null;
    }
  }
}

您还可以使用子集:

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow a user to read a message if the user is in the room
    match /rooms/{roomId} {
      match /documents/{documentId} {
        allow read: if exists(/databases/$(database)/documents/documents/$(documentId)/users/$(request.auth.uid));
      }
      match /users/{userId} {
        // rules to allow users to operate on a document
      }
    }
  }
}

答案 1 :(得分:12)

我通过这段代码实现了

如果同一用户出现在另一个集合的数组中,则允许某些用户读取/写入集合的某些文档

service cloud.firestore {
  match /databases/{database}/documents {
    match /repositories/{accountId} {
      allow read, write: if request.auth.uid in get(/databases/$(database)/documents/accounts/$(accountId)).data.users
    }
  }
}