Firebase 存储 – 无法根据大小要求删除

Posted

技术标签:

【中文标题】Firebase 存储 – 无法根据大小要求删除【英文标题】:Firebase Storage – Can't delete with size requirement 【发布时间】:2019-06-11 05:38:22 【问题描述】:

我希望允许用户仅将文件上传到自己的存储桶中,最大文件大小为 1MB,并且仍然让他们删除文件。我添加了以下内容:

match /myusers/userId/allPaths=** 
  allow write: if request.auth.uid == userId && request.resource.size < 1 * 1024 * 1024;
  allow read: if request.auth.uid == userId;

我在模拟器和我的项目中都进行测试。这不允许我删除文档 (access denied)。如果我从上述规则中删除&amp;&amp; request.resource.size &lt; 1 * 1024 * 1024;,则可以删除文档(但不会阻止上传大于 1MB 的文件。

我认为它可能会拒绝它,因为request.resourcenull,所以我尝试了以下操作:

match /myusers/userId/allPaths=** 
  allow write: if request.auth.uid == userId && (request.resource.size < 1 * 1024 * 1024 || request.resource == null);
  allow read: if request.auth.uid == userId;

仍然,删除失败并出现以下错误(在模拟器中):

错误:simulator.rules 行 [5],列 [16]。对象上的属性资源未定义。

我已经查看了所有这些解决方案,并尽可能多地修改了规则,但无济于事:

Firebase Storage Allow Deleting Files

Firestore Rules Simulator - Resource undefined

Firebase Storage Post rules apply to Delete rules

Firebase Cloud Storage security rule for deleting

有谁知道如何为允许但仍允许删除的文件设置最大大小?

【问题讨论】:

嗯......最后一个应该可以工作,除了我不确定如果你取消引用 null 会发生什么。你可以只用request.resource == null 试试吗?如果正确,请尝试交换 or 中的条件:(request.resource == null || request.resource.size &lt; 1 * 1024 * 1024) @Frank van Puffelen,我们的想法在这里非常一致——也尝试了这两种方法。它也因allow write: if request.auth.uid == userId &amp;&amp; request.resource == null 而失败。而且,在我的屏幕截图中,我确实将订单交换到了(request.resource == null || request.resource.size &lt; 1 * 1024 * 1024),以防由于尝试从null 对象(request.resource)访问size 而导致request.resource.size 崩溃。两者都不起作用,但我刚刚在下面发布的解决方案可以! :) 【参考方案1】:

想通了!以下是在生产环境中在模拟器中都有效的方法:)

match /myusers/userId/allPaths=** 
  allow write: if request.auth.uid == userId && 
                  (request.resource.size < 1 * 1024 * 1024 || request.method == 'delete');
  allow read: if request.auth.uid == userId;

附言@Doug Stevenson,如果您能够在内部提交注释,我想如果 request.methoddeleteupdateget 和/或 create 的示例可以对其他人非常有帮助被添加到文档中!

编辑:

此外,这在模拟器和生产环境中都有效(在我看来,它比第一个选项更具可读性)。感谢@Doug Stevenson 的提示!

match /myusers/userId/allPaths=** 
  allow write: if request.auth.uid == userId && request.resource.size < 1 * 1024 * 1024;
  allow delete: if request.auth.uid == userId 
  allow read: if request.auth.uid == userId;

【讨论】:

酷。我不知道request.method 属性。 实际上需要的是针对每种精细操作类型的细分规则,就像 Firestore 一样:firebase.google.com/docs/firestore/security/… @Doug Stevenson,将其添加到文档中也很棒!我在模拟器和生产环境中测试了它,它也能正常工作!我已经更新了我的答案以包括两个选项:) 嗯,我不认为云存储有删除规则,因为它没有记录。它只显示读写。 老实说我也不知道,但是当我查看了你提到的 Firestore 规则时觉得值得一试哈哈【参考方案2】:

据我所知,这只是控制台模拟器中的一个错误。我根据这些规则编写了实际的(android)应用程序代码,并且能够毫无问题地创建和删除内容。问题是模拟器不明白如何解释request.resource == null,结果整个事情都失败了。

我会为此在内部提交一份错误报告,但如果有什么不合理的地方,您应该始终对照实际产品检查您的规则,因为很难让模拟器完全同步。

【讨论】:

嗨,Doug,当我尝试删除时,我的 Web 应用程序上也返回了“拒绝访问”错误 这个错误在 2 年后仍然存在。

以上是关于Firebase 存储 – 无法根据大小要求删除的主要内容,如果未能解决你的问题,请参考以下文章

Firebase存储文件夹删除[重复]

使用 Firebase 用户管理添加额外字段

Firebase/Flutter - 无法将数据写入数据库

Firebase 删除帐户以及 iOS 上的数据库和存储

Vue 显示来自 firebase 云存储 blob 的图像

无法从 Firestore 文档中删除字段 (Flutter)