Управление доступом к документам для каждого пользователя в Firebase Firestore

#firebase #google-cloud-firestore #nosql

#firebase #google-облако-firestore #nosql

Вопрос:

Допустим, у меня есть users коллекция в моей базе данных Firestore, и пользовательские документы должны быть видны только определенному набору других пользователей (например, подключенным пользователям в приложении для социальных сетей).

Аналогично примеру в документах о безопасном доступе к данным для пользователей и групп, я могу использовать массив visibleTo , который содержит идентификаторы пользователей подключенных пользователей. Затем я могу получить все пользовательские документы, которые должны быть видны любому конкретному клиенту, используя array-contains запрос следующим образом:

 firestore.collection('users').where('visibleTo', 'array-contains', ownUserID).get()
 

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

Для справки рассмотрим этот пример документа:

 {
    firstName: 'John',
    lastName: 'Doe',
    visibleTo: ['userID0001', 'userID0002', 'userID0003', ...] // imagine 200 entries here
}
 

Как я мог бы использовать Firestore для достижения этой функциональности извлечения только «подключенных» пользователей / контактов без фактического извлечения visibleTo массива?

Ответ №1:

Убедитесь, что это поле visibleTo находится в месте, к которому у пользователя нет доступа (новый путь сбора)

Пример:

Расположение документа: /AccessData/{userId}/видимость

и данные могут быть

 {
    visibleTo: ['userID0001', 'userID0002', 'userID0003', ...]
}
 

к вышеуказанной коллекции / AccessData, к которой никто не имеет доступа, может получить доступ только администратор.

Затем убедитесь, что вы переместили логику доступа для чтения в правила безопасности Firestore, а не в логику выборки в приложении. В правилах безопасности Firestore извлеките данные из этого пути и определите, могут ли они просматривать или нет /AccessData/{userId}/видимость

Комментарии:

1. У меня есть эта логика также в правилах безопасности; однако мне это также нужно на стороне клиента, поскольку я точно хочу получать пользовательские документы, которые видны любому клиенту. Я не могу запрашивать, используя поля в других документах, а также правила безопасности не могут выступать в качестве фильтров. Чего мне не хватает?