Правило безопасности Firestore: Как обеспечить уникальность значений в документе? - PullRequest
0 голосов
/ 20 декабря 2018

Может ли приведенное ниже правило безопасности обеспечить уникальность firstName, lastName, username и email перед созданием документа в коллекции профилей?

match /profiles/{document=**} {
   allow create: if request.auth.uid != null
   && (request.resource.data.firstName is string && resource.data.firstName != request.resource.data.firstName)
   && (request.resource.data.lastName is string && resource.data.firstName != request.resource.data.firstName)
  && (request.resource.data.username is string && resource.data.username != request.resource.data.username)
  && (request.resource.data.email is string && resource.data.email != request.resource.data.email)
}

Например, ниже приведены данные в профилях коллекции Firestore

{
   "document1":{
      "firstName":"Jek",
      "lastName":"Choo",
      "email":"jeksomething@gmail.com",
      "username":"jek"
   },
   "document2":{
      "firstName":"Cara",
      "lastName":"Choo",
      "email":"babycara@gmail.com",
      "username":"cara"
   }
}

Я хочу создать нижеуказанный новый документ, и в этом доступе на создание должно быть отказано

{
   "document3":{
      "firstName":"Jek",
      "lastName":"Choo",
      "email":"jeksomething@gmail.com",
      "username":"jek"
   }
}

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

{
   "document4":{
      "firstName":"example",
      "lastName":"com",
      "email":"test@example.com",
      "username":"example"
   }
}

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

1 Ответ

0 голосов
/ 20 декабря 2018

Важно понимать, что resource делает в отношении правил, которые создают новые документы, и это единственное правило, которое вы здесь показываете.

resource относится к "(существующий) документ пишется ".Это отличается от request.resource, который описывает документ, который еще не существует, который собирается существовать, если запись завершится успешно.

Другими словами, в этом разделе :

Переменная ресурса ссылается на запрошенный документ, а resource.data представляет собой карту всех полей и значений, хранящихся в документе.

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

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

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

Если вам нужно, чтобы поле было уникальным, вы должны проверить после создание документа с использованием триггера Cloud Function, затем удалите документ, если он не удовлетворяет требованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...