Firebase 为什么云firestore规则与我的路径模式不匹配?

Firebase 为什么云firestore规则与我的路径模式不匹配?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,所以我有一个简单的数据库,我想制定一个简单的规则,但出于某种原因,它不想匹配我的集合 您需要调整规则,如下所示: service cloud.firestore { match /databases/{database}/documents { match /userPrivate/{user} { allow read, write: if request.auth.uid == user; } } } 您的通配符必须指向一个单路径文档(这是您通过

所以我有一个简单的数据库,我想制定一个简单的规则,但出于某种原因,它不想匹配我的集合


您需要调整规则,如下所示:

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

    match /userPrivate/{user} {
      allow read, write: if request.auth.uid == user;
    }

  }
}
您的通配符必须指向一个单路径文档(这是您通过{
user}
获得的),并且与
userPrivate
集合下的任何文档都不匹配(这是您通过{
user=**}
获得的,换句话说就是“路径的其余部分”)

如果您希望允许用户以相同的安全级别读取/写入
用户
文档子集合中包含的所有文档,则以下规则将起作用:

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

    match /userPrivate/{user} {
      allow read, write: if request.auth.uid == user;

      match /{userCollec=**} {
        allow read, write: if request.auth.uid == user;
      }

    }

  }
}

我建议您观看有关Firestore安全规则的Firebase官方视频,尤其是从5分钟开始的部分。

您没有指定要正确获取的文档。在询问文档位置的文本框中,不要添加
/databases/(default)/documents
。这是为您自动添加的。您应该使用集合和文档id指定文档的路径。例如:
/userPrivate/uid
,其中“uid”是文档id。您可能还应该在模拟器中启用身份验证,以便匹配id


还要记住,当您使用带有两颗星的通配符匹配时,例如
/userPrivate/{user=**}
,则
user
变量将包含文档的整个路径,包括任何子集合。这意味着您的规则将不适用于子集合中的文档。

您确定OP实际上不想保护userPrivate集合下组织的所有文档,包括子集合中的所有文档吗?您的提案没有做到这一点。@DougStevenson您是对的,我不是100%确定OP要求,因此我没有涵盖子集合的情况。。。我已经修改了我的回答以涵盖这个案例。谢谢你指出这一点。@ditoslav嗨,你有机会尝试一下建议的答案吗?
service cloud.firestore {
  match /databases/{database}/documents {

    match /userPrivate/{user} {
      allow read, write: if request.auth.uid == user;

      match /{userCollec=**} {
        allow read, write: if request.auth.uid == user;
      }

    }

  }
}