Firebase Firestore-基于其他集合中文档的安全规则

时间:2018-07-14 03:04:00

标签: firebase google-cloud-firestore firebase-security-rules

我正在努力着手编写更复杂的Firestore安全规则。例如,规则可能取决于动态需要考虑的不同集合中的文档。

以下是馆藏的ER图以及文档字段之间的关系: enter image description here

项目集合:
-如果登录的用户角色===“ LEVEL_1”(每个用户个人资料都包含在 Users 集合中)并且通过 AssignedProjects

Allow read if auth.uid ==== Users.reference === AssignedProjects.userReference === <Current Request’s project reference(s)>

评论集:
-如果用户参与了某个项目,则可以对其发表评论

Allow write if <Current Request’s Comment.postReference> === Posts.projectReference <=> AssignedProjects.projectReference && AssignedProjects.visibleToRoles.contains(auth.uid === Users.role)

我已经尝试过根据此示例使用函数进行此操作,但是到目前为止,我只检索到了User文档,但这是我需要动态引用的内容,例如Posts和Projects令我感到困惑。

任何人都可以帮我写上面两个可以用作基础的书吗?

这些规则是让我无法使用Firestore的唯一原因,因为滚动完整的API和关系数据库对于测试想法而言是过大的。

这是我到目前为止所拥有的:

service cloud.firestore {
    match /databases/{database}/documents {

        function isLoggedIn() {
            return request.auth != null;
        }

        function isAdmin() {
            return get(/databases/$(database)/documents/users/{document=**}).data.role == "ADMIN";
        }

        function isUser() {
            return get(/databases/$(database)/documents/users/{document=**}).data.role == "USER";
        }

        match /configuration/{document} {
            allow read;
            allow create: if (isLoggedIn() == true && isAdmin() == true);
            allow write: if (isLoggedIn() == true && isAdmin() == true);
            allow delete: if (isLoggedIn() == true && isAdmin() == true);
        }

        match /registrationInvitations/{invite=**} {
            function inviteData() {
                return get(/databases/$(database)/documents/registrationInvitations/$(invite)).data
            }
            allow create: if (isLoggedIn() == true && isAdmin() == true);
            allow read;
            allow write: if inviteData().invitationCode == request.resource.invitationCode && isLoggedIn() == false;
            allow delete: if (isLoggedIn() == true && isAdmin() == true);
        }

        match /users/{user=**} {
            function userData() {
                return get(/databases/$(database)/documents/users/$(user)).data
            }
            allow create: if (isLoggedIn() == true && isAdmin() == true);
            allow read: if userData().uid == request.auth.uid;
            allow write: if request.resource.uid == request.auth.uid  && isAdmin() == false
                        || isAdmin();
            allow create: if request.resource.uid == request.auth.uid  && isAdmin() == false
                                    || isAdmin();

            allow create, read, write, update, delete;
        }

        match /companies/{company=**} {
            allow create, read, write, update, delete;
        }


    }
}

0 个答案:

没有答案