Как мне безопасно ограничить пользователей перечислением только созданных ими документов?

#firebase #google-cloud-firestore #firebase-security

#firebase #google-облако-firestore #firebase-безопасность

Вопрос:

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

 db.collection('projects').where('user', '==', firebase.auth().currentUser.uid)
  

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

Я ограничил доступ в правилах, таких как

 match /projects/{project} {
  allow read,update: if request.auth.uid == resource.data.user;
  allow create;
}
  

Но это не работает, вы вообще не можете перечислять.

Есть ли способ сделать это без создания вложенной коллекции записей пользователя в коллекции пользователей? Я бы действительно предпочел иметь их все в одном месте. Конечно, это чрезвычайно распространенный сценарий.

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

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

Ответ №1:

Предполагая, что вы сохранили user_id в поле «user» в firestore. Вы можете использовать

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
   db.collection("projects").whereEqualTo("user", uid)...
  

После многоточий вы можете использовать .get() с onSuccesss или onComplete или добавить прослушиватель моментальных снимков.

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

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

2. Что вы имеете в виду, что вы не получаете «преимуществ оперативных обновлений»? Вы можете добавить прослушиватель моментальных снимков практически ко всему

3. Facepalm… Я нашел решение своей проблемы на firebase.google.com/docs/firestore/security/rules-query На самом деле я думал, что сделал это так, и это не сработало, теперь это так — очевидно, сделал что-то не так в первый раз

4. Отлично! Я рад, что вы это исправили. 🙂