Firestore - настроить безопасность в родительской коллекции и использовать в дочернем без дополнительной выборки - PullRequest
0 голосов
/ 11 мая 2018

Структура Firestore:

Parent (root): /projects/$(projectId)
Child (sub-col.): /projects/$(projectId)/someItems/${someItemId}

Я начал со следующих правил безопасности:

match /projects/{projectId} {

  allow read: if isInCurrentProject(100);
  allow write: if isInCurrentProject(10);

  match /someItems/{someItemId} {
    allow read: if isInProject(projectId, 30)
    allow write: if isInProject(projectId, 20)
  }
}

Первая функция isInCurrentProject для родителя в порядке, выборка не требуется:

function isInCurrentProject(minRole) {
    return resource.data.roles[request.auth.uid] <= minRole;
}

В настоящее время это моя функция isInProject:

function isInProject(projectId, minRole) {
  return get(/databases/$(database)/documents/projects/$(projectId)).data.roles[request.auth.uid] <= minRole;
}

Кажется, это работает, но мой вопрос, есть ли способ, как я могу получить resource.data родителя внутри ребенка так, как яне нужно делать дополнительную выборку (так как это считается дополнительным запросом к базе данных).Что-то вроде resource.parent.data.roles... Если нет, включена ли эта функция хотя бы в план?

Поскольку я хочу защитить каждое чтение и запись на дочернем объекте, это похоже на выборку из базы данных.

Или, по крайней мере, есть какой-то вариант наследования, где я могу определить, что сначала вам нужно иметь доступ к родителю, а если нет, вы вообще не можете получить доступ к детям?Потому что прямо сейчас, если я сделаю родителя более строгим (я не могу получить к нему доступ с определенной учетной записью, недостаточно прав доступа), я все равно могу получить доступ к дочерним элементам (когда я знаю идентификатор родителя)

Источники:

Ролевый доступ

Правила условий

...