Firebase / Firestore如何在Firestore中授予权限特定的集合?

时间:2019-07-18 01:56:26

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

我正在开发Web服务。

我在Firestore中使用以下规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.auth!=null;
    }
  }
}

但是我需要赋予“写”权限特定的集合。

例如,我有一些收藏,例如:

  • /新闻
  • /团队
  • /比赛

我想向他们添加“评论”,例如:

  • / news / {newsId} / comments
  • / teams / {teamId} /评论
  • / matches / {matchId} /评论

所以我想更改权限,例如:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.auth!=null;
    }

    match /news/{document=**}/comments/{document=**} {
      allow read, write;
    }

    match /teams/{document=**}/comments/{document=**} {
      allow read, write;
    }

    match /matches/{document=**}/comments/{document=**} {
      allow read, write;
    }

  }
}

但这不起作用...

我该如何解决这个问题?

enter image description here

2 个答案:

答案 0 :(得分:0)

它抱怨您在同一场比赛中使用了两个glob通配符,这是非法的(而且实际上没有任何意义)。这是您的一场比赛:

match /news/{document=**}/comments/{document=**}

{document=**}全局通配符。这就是**的意思。它将尝试匹配多个路径段。但这不是您想要的。您想要匹配的第一个通配符就是任何给定的文档ID,例如:

match /news/{newsId}/comments/{document=**}

现在,您有{newsId}个新闻集下的文档ID匹配。全局通配符现在与嵌套在/news/{newsId}/comments下的任何文档或子集合的文档匹配。

答案 1 :(得分:0)

这是非法声明:

match /news/{document=**}/comments/{document=**} {

您在相同的上下文中两次使用document作为路径段标识符,这是不允许的。为了使规则有效,请确保每个路径段标识都有唯一的名称。例如:

match /news/{newsDocument}/comments/{commentsDocument=**} {