Проблема была с запросом, а не с правилами безопасности. Это небольшая хитрая вещь, которая не очень хорошо документирована. Итак, давайте посмотрим на мой запрос:
db.collection("boards").whereEqualTo("roles.${me.email}", "admin")
и давайте предположим, что адрес электронной почты n.surname@gmail.com
. Тогда запрос выглядит так:
db.collection("boards").whereEqualTo("roles.n.surname@gmail.com", "admin")
Таким образом, Firestore сначала пытается получить доступ к объекту roles
, затем к объекту n
внутри roles
и так далее, и так далее. Вот почему запрос был отклонен - он не соответствовал определенным правилам безопасности. Если бы это работало, у меня могли бы быть доски объявлений, к которым у меня не было бы доступа.
Чтобы исправить эту проблему, мне пришлось изменить запрос, используя FieldPath
:
db.collection("boards").whereEqualTo(FieldPath.of("roles", me.email), ROLE_ADMIN)