为什么此 Firebase 安全规则测试失败?

Why does this test for firebase security rule fails?

我有一个集合UserActivity,其中每个docId都是用户的id。在不同的 docIds 下,我有子集合 profileVisit,我想在其中放置一些数据 我的 firebase 规则,应该允许 only 创建操作。也就是说,只有在登录并拥有该资源的情况下,用户才能在 Useractivity/{userId}/profileVisit 下创建子集合。所以我的 firebase 规则如下:

match /UsersActivity/{userId} {
      match /profileVisit {
        allow create: if userIsAuthenticated() && userOwnsResource(userId);
      }
    }

function userIsAuthenticated () {
      return request.auth.uid != null;
    }

    function userOwnsResource (userId) {
      return request.auth.uid == userId
    }

也就是说,应该允许以下操作:

firebase
      .firestore()
      .collection("UserActivity")
      .doc(uid)
      .collection("profileVisit")
      .add({
        data: "some data",
      }); 

我写的测试如下:

it("Users can create subcollection profileVisit under their own UsersActivity document if they are signed in", async () => {
    const db = getFirestore(auth);
    const userDoc = db
      .collection("UsersActivity")
      .doc(myId)
      .collection("profileVisit");
    await firebase.assertSucceeds(userDoc.add({ data: "data" }));
  });

此测试失败:FirebaseError: 7 PERMISSION_DENIED: false for 'create'

有人可以向我解释为什么我的测试失败了吗?我的规则写对了吗?还是测试写错了?

编辑

似乎将规则更改为:

match /UsersActivity/{userId} {
          match /profileVisit/{id} {
            allow create: if userIsAuthenticated() && userOwnsResource(userId);
          }
        } 

允许我的测试通过。那就是我将 match /profileVisit 更改为 match /profileVisit/{id} { 谁能解释一下为什么会有差异以及为什么我需要在最后添加 {id}

正如您在编辑中发现的那样,这没有任何作用:

match /UsersActivity/{userId} {
  match /profileVisit {
    allow create: if userIsAuthenticated() && userOwnsResource(userId);
  }
}

match /profileVisitprofileVisit 集合相匹配,但其中没有文档,所以这是一个空洞。

要使其匹配任何文档,请使用:

match /UsersActivity/{userId} {
  match /profileVisit/{docId} {
    allow create: if userIsAuthenticated() && userOwnsResource(userId);
  }
}