Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用数组元素的Firebase身份验证规则_Javascript_Firebase_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Javascript 使用数组元素的Firebase身份验证规则

Javascript 使用数组元素的Firebase身份验证规则,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,我正在使用Firebase和react native。在我的应用程序中,我允许用户与特定用户或所有用户共享内容:读取、复制或修改权限。 由于Firebase不提供用于查询的OR函数,因此我使用一个数组来存储user:permission组合,这样我就可以使用包含任何类似查询功能的数组 .where("access", "array-contains-any", [user_id, `${user_id}:R`, `${user_id}:C`, `${use

我正在使用Firebase和react native。在我的应用程序中,我允许用户与特定用户或所有用户共享内容:读取、复制或修改权限。 由于Firebase不提供用于查询的OR函数,因此我使用一个数组来存储user:permission组合,这样我就可以使用包含任何类似查询功能的数组

.where("access", "array-contains-any", [user_id, `${user_id}:R`, `${user_id}:C`, `${user_id}:M`, "All_R", "All_C", "All_M"])
这使我能够查询所有由user\u id拥有、共享给user\u id或共享给“all”且具有R、C或M权限的内容

现在,我想通过比较已验证的用户ID和数组中的用户ID,对身份验证规则执行类似的操作(以便只有具有“M”权限的用户才能修改等)。为了做到这一点,它需要一个类似于“array contains any”的功能和身份验证规则的字符串连接


这是可能的还是我需要做一些不同的事情?

我运行了一些测试,并且认为我得到了您正在工作的类型的子集。我将完成下面的步骤,以便您最终可以从中构建


第一步是使此查询正常工作:

ref.where("access", "array-contains", user_id)
这很容易通过以下方式实现:

allow list: if request.auth != null && request.auth.uid in resource.data.access;
因此,如果
access
数组中提到了他们的UID,任何人都可以阅读文档


下一步是允许此查询:

ref.where("access", "array-contains-any", [user_id, user_id+":R"]);
当我们按照之前的规则运行时,这是不允许的。这是因为我们正在请求一个规则不知道的值

要使其工作,请将规则更改为:

allow list: if request.auth != null && (
  request.auth.uid in resource.data.access || 
  request.auth.uid+":R" in resource.data.access
);
因此,现在代码和规则中的条件再次匹配,并且允许读取


如果我们为所有访问规则添加另一个条件:

ref.where("access", "array-contains-any", [user_id, user_id+":R", "All_R"]);
然后再次使用上述规则,我们的权限被拒绝,因为我们在查询中有一个规则不知道的值

为了解决这个问题,我们也会在规则中检查该值:

allow list: if request.auth != null && (
  request.auth.uid in resource.data.access || 
  request.auth.uid+":R" in resource.data.access ||
  "All:R" in resource.data.access
);
使用这些规则,查询再次成功



此时,您可以在这里添加其他条件,它应该可以工作。

我运行了一些测试,并认为我得到了您正在工作的类型的子集。我将完成下面的步骤,以便您最终可以从中构建


第一步是使此查询正常工作:

ref.where("access", "array-contains", user_id)
这很容易通过以下方式实现:

allow list: if request.auth != null && request.auth.uid in resource.data.access;
因此,如果
access
数组中提到了他们的UID,任何人都可以阅读文档


下一步是允许此查询:

ref.where("access", "array-contains-any", [user_id, user_id+":R"]);
当我们按照之前的规则运行时,这是不允许的。这是因为我们正在请求一个规则不知道的值

要使其工作,请将规则更改为:

allow list: if request.auth != null && (
  request.auth.uid in resource.data.access || 
  request.auth.uid+":R" in resource.data.access
);
因此,现在代码和规则中的条件再次匹配,并且允许读取


如果我们为所有访问规则添加另一个条件:

ref.where("access", "array-contains-any", [user_id, user_id+":R", "All_R"]);
然后再次使用上述规则,我们的权限被拒绝,因为我们在查询中有一个规则不知道的值

为了解决这个问题,我们也会在规则中检查该值:

allow list: if request.auth != null && (
  request.auth.uid in resource.data.access || 
  request.auth.uid+":R" in resource.data.access ||
  "All:R" in resource.data.access
);
使用这些规则,查询再次成功



此时,您可以在此处添加其他条件,它应该会起作用。

您尝试了什么吗?如果不是,这将是一个很好的起点:@FrankvanPuffelen我看到了带有字段的身份验证规则示例,但没有使用数组。此外,我需要字符串连接和通配符来匹配数组中的用户id和权限。e、 g.如果访问包含request.auth.uid+“:M”,则允许写入。由于缺少数组和字符串连接的示例,我认为这样做可能是不可能的,我可能需要改变我的方法。你试过什么了吗?如果不是,这将是一个很好的起点:@FrankvanPuffelen我看到了带有字段的身份验证规则示例,但没有使用数组。此外,我需要字符串连接和通配符来匹配数组中的用户id和权限。e、 g.如果访问包含request.auth.uid+“:M”,则允许写入。由于缺少数组和字符串连接的示例,我认为这样做可能是不可能的,我可能需要改变我的方法。谢谢,这很有效!顺便说一句,在我的应用程序中,“R”表示文档是只读的(非所有者的用户不能复制或更新文档)。“C”表示文档可以读取并复制到新文档,但不能更新(只有所有者可以更新),而“M”表示文档可以读取、复制到新文档或更新。因此,如果我错了,请纠正我的错误,但Firebase规则可以帮助我获得读写权限,但应用程序需要确保只读文档不会被复制,即写入新文档或更新。是否有基于正在编写的数据值的规则?谢谢,这很有效!顺便说一句,在我的应用程序中,“R”表示文档是只读的(非所有者的用户不能复制或更新文档)。“C”表示文档可以读取并复制到新文档,但不能更新(只有所有者可以更新),而“M”表示文档可以读取、复制到新文档或更新。因此,如果我错了,请纠正我的错误,但Firebase规则可以帮助我获得读写权限,但应用程序需要确保只读文档不会被复制,即写入新文档或更新。是否有基于正在写入的数据值的规则?