Правила Firestore, позволяют обновлять только определенные поля - PullRequest
1 голос
/ 03 мая 2020

У меня есть следующая коллекция баз данных '/player_profiles/{userId}'. Я хочу использовать правило, что только request.auth.uid == userId, если только они не обновляют совпадения полей, которые являются массивом. Я пробовал это, но он отказал в разрешениях

match /player_profiles/{userId}{
        allow write: if userId == request.auth.uid; 
      allow update: if (request.resource.data.keys().hasOnly(["matches"]) && request.auth != null);
    }

А вот код Flutter, который запускает обновление для добавления элемента в массив совпадений:

await DatabaseProvider()
        .db
        .collection(PLAYER_COLLECTION)
        .document(widget.userProfile.userId)
        .updateData({
      'matches': FieldValue.arrayUnion([profile.userId])
    });

Я новичок в firestore правила, но я думал, что это будет работать

Был в состоянии получить поведение, которое я хотел с этим:

match /player_profiles/{userId}{
        allow write: if request.auth.uid == userId || (request.auth != null && request.resource.data.diff(resource.data).affectedKeys().hasOnly(["matches"]));
    }

Глядя на ответ @Doug Stevenson, хотя я могу добавить, чтобы убедиться, что они только разрешены добавить свой собственный идентификатор пользователя в профили других людей.

1 Ответ

2 голосов
/ 03 мая 2020

request.resource.data.keys() всегда содержит каждое поле в документе, независимо от того, обновляется оно или нет. Вместо этого вы должны использовать новый MapDiff API, чтобы сравнить то, что пишется, с тем, что существует в настоящее время.

Я думаю, вы захотите сделать что-то вроде этого:

if
  (request.resource.data.diff(request.resource.data).affectedKeys().hasOnly(["matches"]) &&
  (request.resource.data.matches.toSet().difference(resource.data.matches) == [userId].toSet()) ||
  request.auth == null;

Я не проверял, но я думаю, вы поняли идею. Вам нужно будет свободно использовать связанную документацию API для правил безопасности для эффективной работы с картами, наборами и списками.

...