Можно ли прочитать документ в Firestore, а затем заблокировать его, чтобы никто другой не мог его прочитать? - PullRequest
1 голос
/ 30 марта 2019

Я создаю приложение, в котором пользователи могут вращать колесо фортуны.Когда им повезет и они получат определенное поле, они могут выиграть купон.

Я хотел сохранить эти купоны в Firebase Firestore со следующими свойствами:

{
"code" : 381939,
"expire_date" : xxx,
"value" : 5,
"currency" : "EUR"
}

Я думал, что когда кто-товращает колесо фортуны, случайный купон / документ будет выбран из базы данных.Если купонов нет, колесо фортуны должно быть неактивно.Поэтому я думаю, что мне нужно разместить кнопку «проверить наличие купонов» или аналогичную, чтобы проверить, остались ли купоны.Когда они есть, колесо будет установлено активным.

Тогда есть два сценария: 1) они выигрывают: купон будет назначен пользователю и удален из базы данных 2) потерян: купонбудет храниться в базе данных.

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

Так можно ли "заблокировать" документ, чтобы никто другой не мог его прочитать, после того, как кто-то его прочитает?Или как я могу быть уверен, что каждый пользователь будет читать разные купоны / документы из базы данных, чтобы не было пользователей, разделяющих этот купон?

Надеюсь, вы понимаете мой вопрос.

Если вынужна дополнительная информация, просто скажите мне.

Ответы [ 2 ]

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

Я думаю, что вы должны использовать облачную функцию firebase из соображений безопасности, потому что вы, пользователи, не должны иметь возможность писать купоны.Когда пользователь выиграет, вызовите облачную функцию, которая случайным образом добавит ownerId к доступному купону:

{
  "code" : 381939,
  "expire_date" : xxx,
  "value" : 5,
  "currency" : "EUR"
  "owner" : "ownerId"
}

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

Не забудьте добавить правила безопасности, чтобы ваши пользователи могли получать только купоны, с которыми они связаны:

 match /databases/{database}/documents {
      function authenticated() { return request.auth.uid != null }
      function isMyCoupons () { return request.auth.uid == resource.data.owner }

      match /coupons/{coupon} {
        allow read: authenticated() && isMyCoupons();
      }
    }
0 голосов
/ 30 марта 2019

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

Например, допустим, вы добавили в документ поле owner с пользователемUID, если они запросили купон:

{
  "code" : 381939,
  "expire_date" : xxx,
  "value" : 5,
  "currency" : "EUR"
  "owner" : "uidOfOwner"
}

Теперь мы позаботимся о том, чтобы:

  1. Пользователи могли только читать документ, если у него нет владельца, или , если они являются владельцем.
  2. Пользователи могут писать в документ, только если у него еще нет владельца.

Мы можем сделать этос этими правилами:

match /databases/{database}/documents {
  match /coupons/{coupon} {
    allow read: if !resource.data.keys().hasAll(['owner']) || resource.data.owner == request.auth.uid;
    allow write: if !resource.data.keys().hasAll(['owner']);
  }
}

Здесь следует отметить несколько моментов:

  • С помощью вышеуказанных правил вы контролируете доступ к отдельным документам, но пользователи не смогут читать /запросить всю коллекцию couponsЕсли вы по-прежнему хотите это разрешить, взгляните на защиту запросов .
  • С помощью приведенных выше правил пользователь может изменять все, что он хочет, в документе без владельца (или которого онявляются владельцем).Возможно, вы захотите еще больше ограничить права на запись, чтобы пользователь мог писать только поле владельца.См. Этот ответ в проверке изменения поля .
...