当前位置: 首页 > 知识库问答 >
问题:

允许公共或所有者-私有文件访问的Firebase存储安全规则

笪煌
2023-03-14

考虑一个允许用户在Firebase存储中存储照片的应用程序,这些照片在cutom元数据“所有者”字段中设置了用户的ID。

以下firebase存储安全规则确保只有他们可以看到自己的照片:

allow read: if resource.metadata.owner == request.auth.uid;

现在想象一下,如果用户愿意,该应用程序允许用户公开他们的照片,任何人都可以看到,即使是未登录的用户(request.auth==null)。这可以通过另一个自定义元数据字段和一个略有不同的规则来完成:

allow read: if resource.metadata.owner == request.auth.uid || resource.metadata.public == "true";
import * as functions from 'firebase-functions';
import * as storage from '@google-cloud/storage';

// 'data' contains 'path' of all photos to update and 'public' which will be set to "true" or "false"
export const updatePublicMetadataField = functions.https.onCall( async (data, context) => {
    const s = new storage.Storage();
    const bucket = s.bucket("bucket name")

    const options = { prefix: data.path }
    const md = { metadata: {public: data.public}}
    const [files] = await bucket.getFiles(options)
    for (const file of files) {
        try {
            await file.setMetadata(md)
        } catch(error) {
            return { r: 'Error: ' + error};
        }
    }
    return { r: 'Files processed: ' + files.length};
});

Firebase目前似乎不支持我的一些想法是:

  1. 在同一文件夹中使用包含所需元数据的单个“安全文件”,该元数据可以由get()函数读取,类似于Firestore安全规则读取任意文档的方式。
  2. 从Firebase存储安全规则访问Firestore,以允许从Firestore读取用户所需的值“public”。
  3. Firebase存储“文件夹”上的元数据。
  4. 一个更新“文件夹”中所有文件的元数据的单一(快速)函数。例如。bucket.setMetadata(前缀,元数据)

共有1个答案

仰经武
2023-03-14

到今天为止,Firebase存储规则还没有提供与Firestore规则相同的功能。不可能使用get()查询其他文档,也不可能访问Firestore文档。您对元数据字段所采取的方法确实是一种合理的解决办法,尽管正如您已经指出的那样,存在一些性能权衡。

为了避免Firebase函数超时,一个选项可能是使用Google Compute实例来完成这样的更新工作,可以使用您已经拥有的代码,也可以使用gsutil命令行工具,因为Firestore存储是支持Google Cloud Storage的;最后一个选项允许进行并行元数据更新调用,如本线程所示,并在文档中解释。

第二种选择可能是在检索存储照片的代码中引入条件语句,以首先检查Firestore中的用户隐私设置并相应地继续。

 类似资料:
  • Firebase存储允许使用URL访问文件

  • 假设我有下面的s3结构 我目前拥有以下权限,可以访问每个文件夹、子文件夹和文件。这是一个网络应用程序。 使用管理员IAM访问密钥id:ABCD我可以使用carrierwave将图像放入子文件夹。我使用一个cloudfront根url从各种“文件夹”和“子文件夹”发送图像 发送到sub_folder2的图像不会显示在网站上,它们是高分辨率的。他们不应该被任何人访问,除了管理员。 我如何在compan

  • 拒绝许可。无法访问存储桶..请访问Firebase控制台中的Storage选项卡,为您的存储桶启用Firebase存储,并确保您有足够的权限来正确提供资源 在谷歌搜索如何设置这些安全规则,我不确定什么是正确的答案。一些答案建议我在代码中编写方法来授予权限,但文档建议我需要在Firebase的端进行。 这是其中一个例子 我无法理解人们的回答 就像几个月前的这张 有人能解释一下当前的Firebase(

  • 本文向大家介绍具有公共文件访问权限集的Drupal私有文件下载,包括了具有公共文件访问权限集的Drupal私有文件下载的使用技巧和注意事项,需要的朋友参考一下 Drupal有两种允许用户下载文件的方式,它们是私有的和公共的。 在公开的情况下,任何人都可以打开文件,而Drupal则不参与下载过程。这意味着下载文件时不会记录任何统计信息或使用权限。每个文件均按名称引用。 私有文件访问意味着每次下载文件

  • 任何指导都非常感谢! 谢谢,A。

  • 问题内容: { “rules”: { “users”: { “$uid”:{ //Private whatever under “uid” but Public is exposed “.read”: “auth != null && auth.uid == $uid”, “.write”: “auth != null && auth.uid == $uid”, 我创建这些规则是为了让用户拥有公共