Я пытаюсь написать некоторые правила безопасности Firestore, которые позволяют пользователям писать только в определенные поля в своих документах (например, электронная почта, пол, предпочитаемое имя, адрес).
Я написал следующее правило записи, чтобы ограничить доступ к указанным c полям:
match /databases/{database}/documents {
match /users/{userId} {
allow read: if userIsAuthenticated()
&& userIsAccessingTheirData(userId);
// Users can always write to specific fields
allow write: if userIsAuthenticated()
&& userIsAccessingTheirData(userId)
&& request.resource.data.keys().hasOnly(["preferredName","gender", "email", "address"]);
Правила хорошо работают, когда мы вызываем userDo c .set в коде, но не работают, когда мы вызываем userDo c .update .
Используя эмулятор правил Firestore, я вижу, что когда мы вызываем "set", request.resource.data.keys()
имеет только те поля, которые передаются в вызове, но когда я вызываю "update", все поля документ находится в коллекции ключей :-(, что делает невозможным фильтрацию.
Есть ли способ написать правило безопасности, ограничивающее поля, как указано выше, которое работает как для установки, так и для обновления?