Exists () не работает с правилами второй переменной Cloud Firestore - PullRequest
0 голосов
/ 17 мая 2018

В моем проекте я хочу контролировать доступ к документу, проверяя, является ли uid пользователя частью вложенной коллекции (которая содержит всех членов этого документа) этого документа.Когда я хочу проверить это с помощью метода exist (), он не дает разрешения, когда должен.

 match /events/{season}/events/{code} {
    function isVV (season, code) {
      return exists(/databases/$(database)/documents/events/$(season)/events/$(code)/vv/$(request.auth.uid));
    }

    allow read: if isVV(season, code);

Когда я заменяю $ (код) значением, которое я сейчас тестирую, правило проходит, и все работает как положено.Когда я использую переменную, это не так.

Какие-нибудь эксперты по правилам облачного пожарного хранилища, которые могут мне помочь?Может быть, есть лучший способ сделать это?

1 Ответ

0 голосов
/ 14 ноября 2018

По какой-то причине существует не любит оценивать переменные, кроме базы данных в правилах Firestore.Глядя на документацию, я смог обнаружить, что функция существующие действительно принимает Path, описанную здесь: https://firebase.google.com/docs/reference/rules/rules.Path

Используя эту информацию, я смог достичь чего-то похожего на то, что вы хотели выше, сначалапостроение пути в виде строки с использованием конкатенации, а затем передача его в функцию exists.

Для вашего примера выше это будет выглядеть так:

match /events/{season}/events/{code} {
  function isVV (database, season, code) {
    return exists(path("/databases/" + database + "/documents/events/" + season + "/events/" + code + "/vv/" + request.auth.uid));
  }

  allow read: if isVV(database, season, code);
}

Примечание: вы должны передатьБаза данных как параметр функции, как я обнаружил, что при использовании конкатенации строк таким образом, она не заполняется автоматически, как при использовании чего-то вроде exists(/databases/$(database))

...