Извлечение поля из карты в массив карт - PullRequest
1 голос
/ 03 августа 2020

Мне нужно правило firestore, разрешающее доступ для идентификаторов пользователей, которые находятся в поле пользователей в документе:

Document 1:
    uid: 13423425,
    ...,
    users: [{uid: 123, email: john@gmail.com}, {uid: 456, email: jill@gmail.com}]

Пользователь 123 должен иметь доступ к этому полю, но пользователь 999 не сможет получить доступ к этому документу. Как мне написать правило firestore, которое позволяет мне проверять, находится ли данный идентификатор пользователя в поле users? Я пробовал использовать оператор IN, но в этом случае он не работает, так как это массив карт (а не массив строк или чисел). По сути, я пытаюсь написать такое правило (используя карту):

function isAllowed(sometableId) {
    return request.auth.uid != null
    && request.auth.uid in get(/databases/$(database)/documents/sometable/$(sometableId)).data.users.map(user => user.uid);
}


match /sometable/{sometableId} {
  allow create: if request.auth.uid != null;
  allow read, write: if isAllowed(sometableId);
}

1 Ответ

2 голосов
/ 03 августа 2020

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

Document 1:
    uid: 13423425,
    ...,
    users: ...,
    fullAccess: ['123', '456']

Теперь ваше правило можно записать следующим образом :

match /sometable/{sometableId} {
  allow create: if request.auth.uid != null;
  allow read, write: if request.auth.uid in resource.data.fullAccess;
}

Вы также можете решить эту проблему, используя карту со значениями uid для ключей и вложенными свойствами, содержащими логические значения, указывающие на доступ для чтения / записи.

...