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

Предположим, у нас есть коллекция Firestore с именем todos, где каждая задача будет выглядеть примерно так:

{
    name: "Buy milk",
    completed: false,
    user: "eYtGDHdfgSERewfqwEFfweE" // some user's uid
}

Теперь я хочу предотвратить изменение поля user во время обновлений (другими словами - сделать это поле только для чтения ).

Поверьте мне, я провел свое исследование. Мое update правило выглядит так:

allow update: if request.auth.uid == resource.data.user
              //&& !request.writeFields.hasAny(["user"]);
              //&& !(request.writeFields.hasAny(["user"]));
              //&& !request.resource.data.keys().hasAny(["user"]);
              //&& !('user' in request.resource.data);
              //&& ('user' in request.resource.data) == false;
              //&& !('user' in request.writeFields);

Нет из вышеперечисленных (закомментированных) работ. Все они приводят к ошибке: Error: Missing or insufficient permissions..

Но ...

Становится еще интереснее! Потому что если мы сравним некоторые из приведенных выше правил для положительного результата (он же true), они будут работать!

Например, этот отлично работает (при условии, что мы включили user поле в наш запрос):

allow update: if request.resource.data.keys().hasAny(["user"]) == true;

НО этот не работает (при условии, что мы НЕ включаем поле user в запрос):

allow update: if request.resource.data.keys().hasAny(["user"]) == false;

Может кто-нибудь объяснить мне, что здесь происходит? Возможно ли, что это действительно ошибка в Firestore?

1 Ответ

0 голосов
/ 15 сентября 2018

В разделе «Условия записи для правил безопасности Cloud Firestore» в разделе «Проверка данных», пример # 2

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure all cities have a positive population and
    // the name is not changed
    match /cities/{city} {
      allow update: if request.resource.data.population > 0
                    && request.resource.data.name == resource.data.name;
    }
  }
}

Значит, request.resource.data.user == resource.data.user должно работать на вас? CMIIW

Ссылка: https://firebase.google.com/docs/firestore/security/rules-conditions#data_validation

...