Firestore Правило, позволяющее перезаписать - PullRequest
0 голосов
/ 25 октября 2018

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

"users" :[
   {
     "mHbVq5TUY7brlleejClKm71NBGI2": {
         "name": "Bob Johnson",
         "access": {
             "X0w1VaVIljR1Nc5u3Sbo" : true
         }
   }
]

Я бы хотел, чтобы правила Firestore позволяли создавать новый документ, только если его еще нетсуществует и только если лицо, выполняющее действие, подтвердило свою электронную почту.Для обновления только пользователь, владеющий этим узлом, может выполнить обновление, имя должно быть строкой, и карта доступа не может быть изменена.Я протестировал свое обновление и создал правила в симуляторе, и они работали, как и ожидалось.Однако, когда я запускаю .set (), он полностью перезаписывает весь мой узел и удаляет карту доступа, чего у меня не может быть.Я предполагаю, что .set () на самом деле выполняет обновление и, таким образом, соответствует моим критериям обновления.Итак, как мне помешать кому-либо полностью перезаписать мой узел?Заранее спасибо ... код ниже.

--- КОД ВЫПОЛНЯЕТ ПЕРЕЗАПИСЬ

db.collection("users").doc("mHbVq5TUY7brlleejClKm71NBGI2").set(
  {
    name: "Bill Swanson",
  }
).catch(err => {
  console.log(err.message)
})

--- ПРАВИЛА

function incomingData() {
  return request.resource.data
}

function emailVerified() {
  return request.auth.token.email_verified;
}

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

      function userExists(user_Id) {
        return exists(/databases/$(database)/documents/users/$(user_Id));
      }

        allow create: if !userExists(userId) && emailVerified();
        allow update: if request.auth.uid == userId
                      && !('access' in incomingData())
                      && request.resource.data.name is string;
         allow read: if request.auth.uid != null;
    }
  }
}

1 Ответ

0 голосов
/ 31 мая 2019

При использовании set (), если вы не уверены, существует ли документ, передайте опцию объединения новых данных с любым существующим документом, чтобы избежать перезаписи целых документов.

Вот как передать опциюобъединить обновление с существующим документом.

db.collection("users")
.doc("mHbVq5TUY7brlleejClKm71NBGI2")
.set(
   {
      name: "Bill Swanson"
   },
   {
      merge: true
   }
).catch(err => {
   console.log(err.message)
});

Надеюсь, это поможет.

...