如何在Firestore规则中“加入”

时间:2019-08-11 17:29:19

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

说我有一个users集合,companies集合和companyUserMemberships集合。 userscompanies彼此独立,并且companyUserMemberships具有用户和公司字段(以及其他元数据,例如其权限级别)。例如,假设我们想将“帖子”添加到公司应用中。

我不知道的部分是如何对此进行验证。我希望公司中的任何人都可以阅读“帖子”,但不希望公司以外的人阅读,但是我还只希望发布者可以更新/删除。

似乎无法真正查询,因此到目前为止,我想出的最好的主意是将公司内的用户uid列表存储为map类型,并且具有元数据并摆脱掉共companyUserMemberships个。像这样:

enter image description here

我只是不确定这是否“正确”。嵌套感觉不正确,但是我不确定是否只是因为我来自SQL背景。

1 个答案:

答案 0 :(得分:0)

  

我希望公司中的任何人都可以阅读“帖子”,但不要在外面阅读   公司,但我也只希望发布该信息的用户能够   更新/删除。

根据您的问题,我假设您具有以下要求:

1)用户可以为公司创建帖子,并更新/删除他/她创建的帖子。

Posts收集所需的验证条件:

  1. allow create:用户是否已通过身份验证?
  2. allow update, delete:用户是否已通过身份验证?帖子是由用户创建的吗?

2)公司中的任何人都可以阅读为公司创建的帖子。

Posts收集所需的验证条件:

  1. allow read:用户是否已通过身份验证?用户属于帖子的公司吗?

您可以使用Cloud Firestore安全规则来实施这些验证,而无需companyUserMemberships集合。

我假设在posts集合中创建的文档在字段createdBy中具有有关帖子作者的信息,在字段company中具有有关帖子的公司名称的信息。

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

    //Get the user using uid
    function getUser() {
        return(get(/databases/$(database)/documents/users/$(request.auth.uid)).data);
    }

    //Check if user exists
    function isValidUser(user) {
    //Validate the necessary privileges 
        return (user != null);
    }

    // Check access for Posts
    match /posts/{postId} {
        // Any authorized user of a company can read posts for the company
        allow read: if ( isValidUser(getUser()) && resource.data.company == getUser().company)
        // Any authorized user can create a post
        allow create: if ( isValidUser(getUser()));

        // Any authorized user can update and delete his/her a post only
        allow update, delete: if ( isValidUser(getUser()) && request.resource.createdBy == getUser().uid);
    }
  }
}

希望这会有所帮助。