Правило безопасности Firestore, чтобы проверить, существует ли уже имя пользователя персонажа - PullRequest
0 голосов
/ 25 августа 2018

У меня есть следующая структура коллекции символов в моей базе данных (firestore)

/characters/{uid}
 - username: string
 - clan: string
 - mana: number
 - health: number
 etc...

Я пытаюсь выяснить правило безопасности для /characters/{uid} со следующей логикой

service cloud.firestore {
  match /databases/{database}/documents {

    // Characters
    match /characters/{characterID} {
      allow create: if isValidUsername();
    }
  }
}

здесь функция isValidUsername проверяет различные вещи, такие как длина, специальные символы и т. Д. ... но я не могу понять, как проверить следующее внутри функции

Убедитесь, что request.resource.data.username уникален, т. Е. Отсутствует в каком-либо другом документе /characters коллекции.

1 Ответ

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

TL; DR: Обеспечение уникальности возможно только путем создания дополнительной коллекции.

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

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

...