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
)。如果我从上述规则中删除&& request.resource.size < 1 * 1024 * 1024;
,则可以删除文档(但不会阻止上传大于 1MB 的文件。
我认为它可能会拒绝它,因为request.resource
是null
,所以我尝试了以下操作:
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 < 1 * 1024 * 1024)
。
@Frank van Puffelen,我们的想法在这里非常一致——也尝试了这两种方法。它也因allow write: if request.auth.uid == userId && request.resource == null
而失败。而且,在我的屏幕截图中,我确实将订单交换到了(request.resource == null || request.resource.size < 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.method
与 delete
、update
、get
和/或 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 存储 – 无法根据大小要求删除的主要内容,如果未能解决你的问题,请参考以下文章