使用通配符的Cloud Firestore规则无效

时间:2018-04-05 01:52:21

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

我已经为我的Cloud Firestore数据库设置了规则,我无法弄清楚如何在以下调用中获取userId通配符。

第一个代码段有效,因为我在用户节点上搜索,文档Id(resource.id)与uid相同。

第二个代码段在写入例如users / uid / items / itemId时不起作用。在这种情况下,Resource.id将等于itemId,并且如下所示尝试映射通配符不起作用。我已根据Firebase规则文档尝试了request.path [6]和request.path [1],但成功了。

    match /users/{user} {
      allow read;
      allow write: if request.auth.uid == resource.id; //WORKS LIKE A CHARM
    }

    match /users/{userId}/{document=**} {
      allow read;
      allow write: if request.auth.uid == request.path['userId']; //ALWAYS FAILS
    }

编辑1: 例如,当我使用新项目的参数对/ users / 12dij1od / items / itemId进行POST时,我希望它能够通过用户12dij1od,而不是其他任何用户。截至目前,每个人都失败了。

我也试过“允许写:if request.auth.uid == userId”

我可能做错了什么想法?

编辑2:

如果有办法解决它声明所有嵌套集合,我也愿意这样做。类似的东西:

        match /users/{userId} {
          allow read;
          allow write: if request.auth.uid == request.path['userId']; //ALWAYS FAILS

          //Nested Subcollection
          match /items/{item} {
          allow read;
          allow write: if request.auth.uid == [ACCESS TO USERID HERE];

        }

1 个答案:

答案 0 :(得分:0)

对于其他有相同问题的人,通过试验我得到了以下代码,但我确实有效:

    match /users/{userId} {
      allow read;
      allow create;
      allow update, delete: if request.auth.uid == resource.id;

        function getUserId() {
          return get(/databases/$(database)/documents/users/$(userId)).id
        }

        match /{document=**} {
          allow read;
          allow write: if getUserId() == request.auth.uid;
        }

    }