#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. Отлично! Я рад, что вы это исправили. 🙂