如何设置每个用户可以上传到 Firebase Storage 的存储量限制?

Rip*_*s55 6 security google-cloud-storage firebase firebase-security

我正在努力找出如何设置每个用户可以上传到我的应用程序存储的存储限制。

我找到了在线方法Storage.storageLimitInBytes,但我在 Firebase 文档中甚至没有看到此方法,更不用说如何设置它的说明了。

一般来说,初创公司如何监控用户上传图像的次数,他们在用户文档中是否有一个字段,例如amountOfImagesUploaded:每次用户上传图像时我都会增加该计数,这样我就可以看到谁以这种方式滥用存储。

或者我是否需要类似的文档来跟踪用户每天上传的内容,当计数达到 100 或其他值时,然后对该用户采取行动。

对于我面临的这个问题,我非常感谢您的帮助。

Pri*_*dra 5

Cloud Storage for Firebase 安全规则的限制分别适用于每个文件/对象,并不适用于整个操作。您可以通过Firebase Storage 的安全规则限制用户可以上传的内容。例如,(来自链接的文档)是限制上传文件大小的一种方法:

service firebase.storage { 
match /b/<your-firebase-storage-bucket>/o { 
match /images/{imageId} { // Only allow uploads of any image file that's less than 5MB 
allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*'); 
} } }
Run Code Online (Sandbox Code Playgroud)

但目前这些规则无法限制用户可以上传的文件数量。一些需要考虑的选项:

  1. 如果您对用户上传的文件的名称进行硬编码(这也意味着您将限制他们可以上传的文件数量),并为每个特定用户的文件创建一个文件夹,您可以确定用户的文件夹,从而限制总和。

    例如:如果您修复文件名并将允许的文件名编号为 1..5,则用户只能存储五个文件:

    match /public/{userId}/{imageId} { 
    allow write: if imageId.matches("[1-5]\.txt"); 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,您可以在客户端上将所有文件压缩在一起,然后上传生成的存档。在这种情况下,安全规则可以强制规定该文件的最大大小。

  3. 当然,您可以包含客户端 JavaScript 代码来检查这两种情况下组合文件的最大大小。恶意用户可以轻松绕过此 JavaScript,但大多数用户并不是恶意的,他们会感谢您通过阻止无论如何都会被拒绝的上传来节省他们的带宽。

  4. 您还可以使用 HTTPS 云函数作为上传目标,然后仅将满足您要求的文件传递到云存储。或者,您可以使用云函数,该函数在用户上传时触发,并在更改后验证该用户的文件。例如:您必须通过云功能/服务器上传文件并跟踪用户上传的总大小。为了那个原因,

    • 将图像上传到您的服务器
    • 检查大小并将其添加到数据库中存储的总大小中
    • 如果用户超过 150 GB,则返回配额超出错误,否则上传到 Firebase 存储 用户 -> 服务器 -> Firebase 存储
  5. 一个更简单的替代方案是使用云存储触发器,每次上传新文件时都会触发云功能。您可以使用元数据检查对象大小并将其添加到数据库中。在这种情况下,您可以在自定义声明中存储用户使用的总存储空间(以字节为单位)。

    exports.updateTotalUsage = functions.storage.object().onFinalize(async (object) => { 
    // check total storage currently used 
    // add size of new object to it 
    // update custom claim "size" (total storage in bytes) 
    })
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您可以编写一条安全规则,检查新对象的大小总和和正在使用的总存储空间不超过 150 GB:允许写入:if request.resource.size + request.auth.token.size < 150 * 1024 * 1024

  6. 如果您需要每个用户的存储验证,您也可以查看此线程。该解决方案有点棘手,但可以通过以下方式完成: https://medium.com/@felipepastoree/per-user-storage-limit-validation-with-firebase-19ab3341492d


gui*_*ere 0

Google Cloud(或 Firebase 环境)不了解用户。它知道您的应用程序,并且您的应用程序也知道。

如果您想获得每个用户的统计数据,您必须将这些数据记录在某处并执行求和/聚合以获得您的指标。

通常的方法是使用 Firestore 存储这些信息并增加文件数量或使用的总空间。

一个不寻常的解决方案是在 Cloud Logging 中记录每个操作,并执行从 Cloud Logging 到 BigQuery 的接收器,以在 BigQuery 中查找您的指标并直接从那里执行聚合(延迟较高,这一切都取决于您想要实现的目标、同步或这些指标的异步检查)