Firebase 存储 – 不能删除大小要求

Rba*_*bar 5 firebase firebase-security firebase-storage

我想允许用户只将文件上传到他们自己的存储桶中,最大文件大小为 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;
}
Run Code Online (Sandbox Code Playgroud)

我正在模拟器中进行测试并在我的项目中进行测试。这不会让我删除文档 ( access denied)。如果我&& request.resource.size < 1 * 1024 * 1024;从上面的规则中删除,则可以删除该文档(但不会阻止上传大于 1MB 的文件。

我想可能是因为request.resourceis拒绝它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;
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,删除失败并出现以下错误(在模拟器中):

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

在此处输入图片说明

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

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

Rba*_*bar 5

弄清楚了!这是在生产环境模拟器中都有效的方法:)

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;
}
Run Code Online (Sandbox Code Playgroud)

ps @Doug Stevenson,如果您能够在内部提交注释,我想如果可以将带有、、和/或 的request.method示例添加到文档中,这对其他人将非常有帮助!deleteupdategetcreate

编辑:

此外,这在模拟器和生产中都有效(在我看来,比第一个选项更具可读性)。感谢@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;
}
Run Code Online (Sandbox Code Playgroud)