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

Я пользуюсь firestore, и у меня есть пользователи с атрибутом domain:

{ 
    domain: "@domain.com"
}

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

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

До сих пор я пытался добавить это в свои правила безопасности, но это допускает дубликаты:

match /databases/{database}/documents {
    match /users/{Id} {
    allow read: if true;
    allow create: if get(/databases/$(database)/documents/users/$(Id)).data.domain != request.resource.data.domain;
  }
}

Есть идеи, возможно ли это или нет, используя только правила безопасности?

1 Ответ

0 голосов
/ 24 апреля 2018

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

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

Например,

users
  user1: { domain: "@domain.com" }
  user2: { domain: "@other.com" }
domains
  "domain.com": "user1"
  "other.com": "user2"

Теперь ваши правила безопасности могут проверить, является ли домен ужезаявлено в коллекции /domains.

Обратите внимание, что вы хотите использовать пакетную запись для выполнения обновлений, поскольку /users и /domains всегда должны синхронизироваться вэтот подход.

...