Метод разбиения правил безопасности Firestore не работает должным образом - PullRequest
0 голосов
/ 05 марта 2019

У меня две проблемы:

  • Вы не можете изменить период '.'символ в «правилах Firebase», когда вы используете что-то вроде «request.auth.token.email» (очень ограниченные опции для работы со строками и объединения, функции замены не поддерживаются)
  • Вы не можете использовать электронную почту вВаш запрос из-за того же символа точки, что и «ключ», при использовании hashmap.

Отказ от подхода HashMap из-за проблем, описанных выше, я пытаюсь исследовать массивы.Есть ли какой-нибудь способ получить зарегистрированную электронную почту пользователя по request.auth.token.email и сравнить ее с «почтовыми» элементами массива в документе?

Например - у меня есть 'bb @ gmail.com 'как зарегистрированный пользователь, я хотел бы получить все документы, в которых массив sharedWith содержит запись bb@gmail.com, и игнорировать остальные документы.Я могу добиться этого в коде, но я хочу настроить это устройство как «правило безопасности», чтобы сделать чтение документа более надежным.

--------- Update ----------- Я попытался разделить и объединить мое правило безопасности, как показано ниже: (ref: Использование функции замены в правилах безопасности firestore )

  allow read: if isSignedIn() && resource.data.sharedWith[(request.auth.token.email).split('.').join(',')] in ["true"];

Мой запрос выглядит следующим образом:

db.collection("Sites")
        .whereEqualTo("sharedWith.bb@gmail,com","true")

Мой документ содержит следующее:

sharedWith
     mm@gmail,com : "true"
     bb@gmail,com : "true"

И пользователь вошел как'bb@gmail.com'

Вышеуказанная настройка не работает.Я получаю ошибку "Отказано в разрешении".Я не знаю, что я делаю не так, помогите, пожалуйста.

1 Ответ

0 голосов
/ 05 марта 2019

Структура вашего документа выглядит как карта, но вы рассматриваете ее как массив.Вы не можете сделать это.Вы можете выполнять операции с массивами только с полями типа массива.Если у вас есть поле типа объекта, операция с массивом завершится неудачно, и ваше правило немедленно отклонит доступ.

Если вы хотите проверить, есть ли свойство поля объекта со значением true (и выследует использовать логическое значение, а не строку), а затем проверить наличие этого объекта.Поле типа объекта в Firestore - это Map объект - это правила, вы можете получить значение этого свойства, используя квадратные скобки.

resource.data.sharedWith[request.auth.token.email.split('.').join(',')];

Это выражение должно иметь значение true, если измененная строкаприсутствует и true.

Опять же, не используйте строковое значение «true», которое отличается от более подходящего логического значения true.

...