【问题标题】:Firebase Storage Rules matching filename without Extension to User IDFirebase 存储规则匹配文件名而不扩展用户 ID
【发布时间】:2020-10-17 01:25:49
【问题描述】:

我希望能够以文件名作为用户 ID 存储配置文件的图像,然后我想在我的代码中使用它,以便当我找到用户 ID 时,我可以根据 ID 获取。我正在将代码中的文件名转换为用户 ID,并且可以毫无问题地存储它。我打算使用 Firebase 存储规则来强制执行此约定,但我在尝试获取文件名时遇到了麻烦

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    },
    match /images/profile/full/{imagename}.*{
        allow read;
      allow write: if imagename == request.auth.uid;
    }
  }
}

我尝试使用上述规则,但是当我尝试发布它时收到错误

错误保存规则 - 第 6 行:意外的 ','.;第 7 行:缺少“匹配” 路径前的关键字。;第 7 行:意外的 '.'.;第 7 行:不匹配 输入 '。'期待 {'{', '/', PATH_SEGMENT};第 12 行:意外的“}”。

是否可以使用强制文件名,以及如何设置规则以确保文件名与用户 id 相同并允许所有人读取?

【问题讨论】:

    标签: firebase firebase-storage firebase-security


    【解决方案1】:

    这绝对行不通:

    match /images/profile/full/{imagename}.*
    

    你只能匹配完整的路径段,而不是像你在这里做的部分。

    这意味着您必须匹配完整的路径段,包括扩展名,然后在规则的条件下对其进行排序。幸运的是,捕获路径段是一个字符串,因此我们可以为此使用正则表达式。

    类似:

    match /images/profile/full/{imagename} {
      allow write: if imagename.matches("^"+request.auth.uid);
    }
    

    【讨论】:

    • 您还需要更改或删除match /{allPaths=**},因为它允许始终对所有文件进行完全读写访问,而不管任何其他规则。
    • 谢谢弗兰克和道格,我希望你们能看到这个。还有一个问题:如果我需要匹配完整的段,这是否意味着我需要为每个文档路径制定规则?是否可以说如果您可以访问父文档,那么您可以访问所有后代?
    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 2020-08-15
    • 2020-01-05
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多