Предположим, у нас есть коллекция 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?