您如何调试Firestore安全规则?

Col*_*gic 5 firebase google-cloud-firestore firebase-security-rules

我在哭自己要睡这个。

getAfter返回的对象只有一个字段,因为其他所有字段类型都不正确。我不知道如何在没有任何调试工具的情况下进行检查(我看不到数据,因此只能进行猜测和检查)。

这是我的规则的精简版本users

match /users/{userId} {
  function isValidUser(user) {
    return user.id is string &&
       (user.address is string || user.address == null) &&
       (user.dateOfBirth is number || user.dateOfBirth == null) &&
       user.email is string &&
       user.name is string &&
       (user.phoneNumber is string || user.phoneNumber == null);
  }

  function isValidWrite(userId, user) {
    return signedIn() && 
        writeHasMatchingId(userId, user) &&
        isValidUser(user);
  }

  allow read: if signedIn();
  allow create: if signedInAndWriteHasMatchingId(userId) &&
    userHasId(userId) &&
    isValidUser(request.resource.data); // Tested
  allow update: if isValidWrite(
    userId,
    getAfter(/databases/$(database)/documents/users/$(userId))
  );
}
Run Code Online (Sandbox Code Playgroud)

这是我要运行的事务。

const user1Ref = this.userCollection.doc(user1Id);
const user2Ref = this.userCollection.doc(user2Id);
const batchWrite = this.store.batch();

batchWrite.update(user1Ref, {
     "details.friend": user2Id,
});
batchWrite.update(user2Ref, {
     "details.wishlist": true,
});

batchWrite.commit();
Run Code Online (Sandbox Code Playgroud)

如果我注释掉该isValidUser(user)行,则操作成功。如果我在function isValidUser(user)except中user.id is string未注释任何行,它将失败。

当Firebase控制台中列出getAfter文档时,为什么文档只包含该id字段,而没有其他字段?有没有一种方法可以输出或调试的值,getAfter这样我什至可以看到它的含义?

aka*_*ppi 6

我仅根据您的问题中的一行来回答:

有没有办法输出或调试 getAfter 的值,以便我可以看到它到底是什么?

至少在 2020 年是这样。

当一个人在规则操场(规则模拟器,见左下角)中运行某些东西时,规则评估中采取的步骤如下所示:

在此处输入图片说明

此列表有时会提供一些指示,以帮助确定规则评估器正在做什么。需要单独“单击”打开的步骤,而不是仅通过瞥一眼就可以看到真/假,这有点乏味。但总比没有好。

注意:我认为 Firebase 正在开发此功能。它有时似乎提供了错误的信息 - 或者我没有正确阅读它。但它可能会有所帮助,并且看起来是向开发人员提供此类信息的好地方。我们真的很想看到:对于当前数据、构建的查询文档和规则,Firebase 是如何看待它的,为什么规则评估为 true 或 false?