Правило Firestore — запрос поля документа без раскрытия всей коллекции

У меня есть users коллекция, в которой есть документы, содержащие различные поля. Каждый идентификатор документа — это идентификатор пользователя firebase, а поля содержат пользовательские данные.

Я использую следующее правило:

match /databases/{database}/documents {
  // Make sure the uid of the requesting user matches name of the user document.
  match /users/{userId} {
    allow read, update, delete: if request.auth.uid == userId;
    allow create: if request.auth.uid != null;
  }
}

Пользователи могут выбирать любимые песни, которые сохраняются в поле массива. Теперь у меня есть требование запрашивать в базе данных пользователей, которые добавили определенные песни в избранное. Я создал следующий запрос:

FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference usersRef = db.collection("users");
usersRef.whereArrayContains("favouriteSongs", "id_of_song");

При выполнении запроса возвращается следующая ошибка:

com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: разрешения отсутствуют или недостаточны.

Очевидно, мне нужно изменить правило Firestore, чтобы пользователь мог запрашивать поле favouriteSongs; однако я не хочу, чтобы все пользовательские данные были доступны всем.

Есть ли способ раскрыть данные favouriteSongs (которые содержат только идентификаторы) и гарантировать, что чтение остальной части пользовательской коллекции ограничено?

Спасибо

Если вы хотите показать пользователю только часть документа, то ответ DarkNeuron правильный. Мне просто интересно, если вы на самом деле не интересуетесь как безопасно запрашивать данные < / а>.   —  person Michael J    schedule 25.09.2020

См. также:  Невозможно изменить переменную загрузки во Flutter
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Michael J

    К сожалению, нет, правила безопасности действуют на уровне документа / запроса. Таким образом, если правило безопасности разрешает доступ, то пользователь будет иметь доступ ко всему документу.

    Если favouriteSongs — единственное поле, которое может / должно быть открыто для чтения, то это поле должно быть в другом документе.

    Есть несколько вариантов. У вас может быть коллекция корневого уровня под названием favoriteSongs с пользовательскими документами в ней, содержащими только общедоступные данные. Это даст вам возможность легко искать избранное пользователя или запрашивать все данные, чтобы узнать, скольким пользователям нравится конкретная песня.

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

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: