Правила безопасности Firestore - Как я могу использовать переменную для имени поля? - PullRequest
0 голосов
/ 30 августа 2018

Если у меня есть документ, сохраненный в /recordTypeX/{autoKey}, со следующей структурой:

memberUserIds [object]
  hjfjkh32390u09j: true
  kjsklfjkslfklj3: true
  ....
  skfksdjk2249fks: true
someStringField: "Bork, bork, bork!"
someNumericField: 88

Как мне написать правило безопасности для проверки существования одного из memberUserIds? Я пробовал следующее, но CLI не нравится синтаксис.

allow read if resource.data.memberUserIds.$(request.auth.uid) == true;

Я знаю, что переменные можно использовать в путях с get() и exists(), поэтому я подумал, что адресация поля с использованием переменной также возможна, но я не могу обойти синтаксическую ошибку. Это возможно?

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

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

Спасибо за любые мысли.

1 Ответ

0 голосов
/ 31 августа 2018

Вот пример одного из моих правил пожарной базы.

function containsResourceOwnerId() {
    // /database/{database}/documents/example/{exampleId}
    // exampleDocument => { abc123: true }, request.auth.uid = abc123
    return resource.data[request.auth.uid] == true;
}

Вы должны быть в состоянии использовать следующее

function isMemberOf() {
    return resource.data.memberUserIds[request.auth.uid] == true;
}

И используйте там, где вам нужно правило.

match /teams/{teamsId} {
    allow read: if isMemberOf();
...