#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. У меня есть эта логика также в правилах безопасности; однако мне это также нужно на стороне клиента, поскольку я точно хочу получать пользовательские документы, которые видны любому клиенту. Я не могу запрашивать, используя поля в других документах, а также правила безопасности не могут выступать в качестве фильтров. Чего мне не хватает?