Правила доступа к Firestore, основанные на ссылке на документ - PullRequest
0 голосов
/ 10 октября 2018

Firestore имеет тип DocumentReference , который является «указателем» на другой документ пожарного депо.Используя клиент firebase JavaScript, вы можете получить доступ к свойствам (например, «id документа») непосредственно по ссылке.

Например, если существует документ со свойством docRef, который является firetore Store DocumentReference:

const retrievedDoc = await getFirestoreDocument();
console.log(retrievedDoc.docRef.id); // "jRmSeMYDMKiOPGsmkdaZ"

Я пытаюсь добиться того же в рамках правил пожарного депо.Существует пользовательская функция с именем isOwner.Он использует правила пожарного депо get для пути к документу, а затем пытается получить доступ к docRef.id, как если бы это был клиент JavaScript выше.

get(/databases/$(database)/documents/path/to/$(id)).data.docRef.id

Значениеидентификатор документа сравнивается с текущим пользователем.Но когда я проверяю это с помощью симулятора и в реальном коде, это терпит неудачу.Я чувствую, что это должно работать, но это не так.

То, что делает , заключается в сохранении и использовании значения id непосредственно в виде строки (например, get(/path/id).docId) вместо DocumentReference.

Должен ли я бытьУ вас есть доступ к id значению DocumentReference в правилах пожарного депо? Я что-то не так делаю?

Я хочу не делать второй документ get в рамках правила, как описано в этом ответе SO .Это второе «чтение» для каждого триггера этого правила.И я не думаю, что идентификатор документа (который мне нужен) будет доступен при вызове get в любом случае.

1 Ответ

0 голосов
/ 03 декабря 2018

На основании документации:

get() метод должен возвращать объект Resource, который являетсядолжен содержать свойство .id (а также .data).

Например, чтобы ограничить write доступ для аутентифицированного пользователя, который является автором документа книги (авторы документов идентифицируются с помощью uid пользователя), вы должны сделать:

service cloud.firestore {
  match /databases/{database}/documents {
    match /books/{document=**} {
            allow write: if get(resource.data.authorReference).id == request.auth.uid;
    }
  }

}

Все же у меня всегда ошибка property id is undefined on object при попытке..data доступен, поэтому я полагаю, что проблема в API.

...