Как мне установить правила в firestore для групп пользователей - PullRequest
0 голосов
/ 08 апреля 2019

Я новичок в firestore и пытаюсь получить все ресурсы от группы пользователей. В моем случае я использую токен авторизации для отслеживания групп пользователей (я буду использовать это и в облачном хранилище).

Объект группы похож на:

{"managers": { "user1_ID": "owner", "user2_ID": "client" } }

Затем в токене авторизации я устанавливаю UID группы:

{ "groups": { "group1_ID": "owner", "group2_ID": "client" } }

Тогда в правилах firestore я хочу установить что-то вроде этого:

 match /groups/{groupId} {        
   allow create: if request.auth.uid != null;
   allow read: request.auth.token[groupId] != null;
   allow delete, update: if request.auth.token[groupId] == 'owner';
 }

Но теперь я могу просто получить или обновить документ, когда у меня есть идентификатор группы, а правило для чтения документов не позволяет мне найти все группы, в которые входит пользователь, для их перечисления.

Код, который я пытался запустить:

this.unsubscribe = db.collection("groups").onSnapshot(querySnapshot => {
   var groups = [];
   querySnapshot.forEach(function(doc) {
      groups.push({uid: doc.id, ...doc.data()});
   });
   this.setState({sites})
})

Единственное решение, которое я думаю (но еще не проверено) - это получить каждую группу из токена авторизации и сделать запрос на каждый, но я думаю, что это, вероятно, не очень хорошее решение.

Я уже тестировал, используя объект ресурса firestore name и id и даже вставляя id внутри документа.

1 Ответ

0 голосов
/ 08 апреля 2019

Наконец я получил это. Для тех, кто пытается что-то подобное, вот мой код.

Правила:

match /groups/{groupId} {        
  allow create: if request.auth.uid != null;
  allow read: if resource.data.managers[request.auth.uid] != null;
  allow delete, update: if resource.data.managers[request.auth.uid] == "owner";
}

Клиент JS:

this.unsubscribe = db.collection("groups").where(`managers.${firebase.auth().currentUser.uid}`, ">", "").onSnapshot(querySnapshot => {
  var groups= [];
  querySnapshot.forEach(function(doc) {
    groups.push({uid: doc.id, ...doc.data()});
  });
  this.setState({groups})
})
...