首页 > 解决方案 > Firestore 查询带有“hasOnly”的规则

问题描述

我有一个 Firestore 规则,如果用户身份验证的自定义声明令牌的“企业”数组包含文档(这是一个数组)的“businessIds”字段中的所有项目,则应该允许用户阅读并编写该文档,如下所示:

match /users/{userId} {
  allow read, write: if resource.data.businessIds.hasOnly(request.auth.token.businesses);
}

但是,此规则不允许读/写任何文档。这是我的测试:

it("Allows a marketeer to read all its users", async () => {
  ...
  const mp1UserId = "MP1_user_crm";
  const mp1Doc = admin.collection("users").doc(mp1UserId);
  await mp1Doc.set({displayName: "MP CRMer for MP1", type: "MP CRMer", businessIds: ["MP1_ID"]});
  const marketeerAuth = {uid: "marketeer_user", businesses: ["MP1_ID", "MP2_ID"]};
  const db = base.getFirestore(marketeerAuth);
  const testRead = db.collection("users")
  .where("businessIds", "array-contains-any", marketeerAuth.businesses);
  var all = testRead.get();
  await base.firebase().assertSucceeds(all); // FAILS HERE
});

我找不到编写满足规则的查询的方法。firebase.firestore.WhereFilterOp中显然没有hasOnly ()运算符。

请注意,它抱怨hasOnly

FirebaseError: 
false for 'list' @ L59, Function not found error: Name: [hasOnly]. for 'list' @ L136

如何编写可以通过安全规则的查询?


更新:

我被要求解释“request.auth.token.businesses”中的内容。带有自定义声明令牌的 Auth 如下(也可以在 Rule Playground 中构建):

"auth": {
  "uid": "marketeer_user"
  "token": {
    "sub": ""
    "aud": "hanOnly-sandbox"
    "firebase": {
      "sign_in_provider": "custom"
    }
    "businesses": [
      "MP1_ID",
      "MP2_ID",
    ]
  }
}

“resource.data.businessIds”中的数据如下数据库结构:

在此处输入图像描述

标签: firebasegoogle-cloud-firestorefirebase-securityrules

解决方案


推荐阅读