Firebase 如何";加入;火场规则

Firebase 如何";加入;火场规则,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,假设我有一个users集合、companys集合和companyUserMemberships集合用户和公司彼此独立,并且公司成员资格有一个用户和公司字段(以及其他元数据,如其权限级别)。例如,假设我们想在公司应用程序中添加“posts” 我想不出的部分是如何用它进行验证。我希望公司内的任何人都能阅读“帖子”,但不希望公司外的人阅读,但我也只希望发布帖子的用户能够更新/删除 似乎无法进行真正的查询,因此到目前为止,我想到的最好的办法是将公司内部的用户UID列表存储为映射类型,该类型具有元数据,并

假设我有一个
users
集合、
companys
集合和
companyUserMemberships
集合<代码>用户和
公司
彼此独立,并且
公司成员资格
有一个用户和公司字段(以及其他元数据,如其权限级别)。例如,假设我们想在公司应用程序中添加“posts”

我想不出的部分是如何用它进行验证。我希望公司内的任何人都能阅读“帖子”,但不希望公司外的人阅读,但我也只希望发布帖子的用户能够更新/删除

似乎无法进行真正的查询,因此到目前为止,我想到的最好的办法是将公司内部的用户UID列表存储为
映射
类型,该类型具有元数据,并完全消除
公司成员身份
。大概是这样的:

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

我希望公司里的任何人都能读到这篇文章,但外面的人不行 公司,但我也只希望发布的用户能够 更新/删除

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

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

帖子所需的验证
收集:

  • 允许创建:
    用户是否经过身份验证
  • 允许更新、删除:
    用户是否经过身份验证?帖子是否由用户创建
  • 2) 公司中的任何人都可以阅读为公司创建的帖子

    帖子所需的验证
    收集:

  • 允许读取:
    用户是否经过身份验证?用户是否属于该职位的公司
  • 您可以使用云Firestore安全规则来实现这些验证,而无需
    公司成员资格
    集合

    我假设在
    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);
        }
      }
    }
    

    希望这有帮助。

    在firebase规则中,对于这种情况,我认为您需要嵌套,以便集合上方的规则或外部嵌套规则集合上方的id可以应用于内部嵌套规则。你可以这样研究。