Можно ли разрешить доступ к документу, если пользователь является членом родительского документа или родительским родителем, рекурсивно? - PullRequest
0 голосов
/ 01 июля 2019

Вот моя структура данных:

folders(collection): {
    folderA: {
        members: { user123: { role: "author" } }
        folders(collection): {
            folderB: {
                parent(reference): /folders/folderA
                members: { userABC: { role: "author" } }
                folders(collection): {
                    folderC: {
                        parent(reference): /folders/folderA/folders/folderB
                        fieldA: { content: 'x' }
                    }
                } 
            }
        }
    }
}
users: {
    user123 :{
        name: John
    }
    userABC :{
        name: Bob
    }
}

Моя цель - разрешить доступ к документу пользователю, который является членом любого из родителей выше запрашиваемого в данный момент документа.Надежда состоит в том, чтобы разрешить доступ к fieldA обоим user123 (Джон) и userABC (Bob) без написания правил, специфичных для folderA, folderB иfolderC .Идея заключается в том, что потенциально могут быть папки глубиной не менее 20.

Хотя я знаю, что функции правил ограничены, я бы хотел написать правила для этого случая:

match /databases/{database}/documents {
    match /{path=**} {
        allow get: if resource.data.members[request.auth.uid].role == 'author';
        allow get: if isParentAuthor(resource);

        function isParentAuthor(resource){
            if(exists(resource.data.parent) {
                if( get(resource.data.parent.path).data.members[request.auth.uid].role == 'author' ) {
                    return true;
                } else {
                    return isParentAuthor( get(resource.data.parent.path) );
                }
            } else {
                return false
            }   
        }

    }
}

Сейчас у меня есть много уровней глубокого доступа к папкам, жестко закодированным в моих правилах.Но было бы здорово иметь возможность сделать это рекурсивно.Это возможно?Я знаю, что это создаст ситуацию, когда потенциально может быть довольно много запросов документов, но я думаю, что я в целом согласен с этим.Но, может быть, есть более удобный Firebase-y способ справиться с этим с меньшим количеством запросов?

1 Ответ

0 голосов
/ 02 июля 2019

Существуют ограничения с правилами безопасности, которые делают невозможным выполнение того, что вы здесь говорите.

Во-первых, существует ограничение в 10 документов на вызов правила.Это жесткий предел.

Во-вторых, рекурсия не допускается.Правило сразу же сработает, если функция сама вызовет.

Как предлагается в комментариях, сгладьте ваши коллекции.Поместите поле в документ, чтобы указать, где оно логически вложено по сравнению с другими документами.Наличие больших коллекций не имеет большого значения для Cloud Firestore.Вы сможете фильтровать столько запросов, сколько вам нужно.

...