【问题标题】:Why does this test for firebase security rule fails?为什么此 Firebase 安全规则测试失败?
【发布时间】:2022-01-16 10:09:58
【问题描述】:

我有一个集合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}

【问题讨论】:

  • 代码 sn-p 中的.uid 是什么?它是如何初始化的?
  • 对不起,我的意思是.doc(uid)。它只是uid,我发布它是为了说明。我想我发现了我的“错误”......第二个嵌套规则应该是match /profileVisit/{id} ,也就是说我需要添加{id},即使我没有在规则中使用它?
  • 你在做某事。调查一下,让我们知道。 :)

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2014-02-27
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多