Структура 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...
Если нет, включена ли эта функция хотя бы в план?
Поскольку я хочу защитить каждое чтение и запись на дочернем объекте, это похоже на выборку из базы данных.
Или, по крайней мере, есть какой-то вариант наследования, где я могу определить, что сначала вам нужно иметь доступ к родителю, а если нет, вы вообще не можете получить доступ к детям?Потому что прямо сейчас, если я сделаю родителя более строгим (я не могу получить к нему доступ с определенной учетной записью, недостаточно прав доступа), я все равно могу получить доступ к дочерним элементам (когда я знаю идентификатор родителя)
Источники:
Ролевый доступ
Правила условий