无需使用自定义授权即可创建对firebase存储的组访问权限

eca*_*lvo 3 firebase firebase-security firebase-storage

有没有办法按组控制上传到Firebase存储中的路径?例如,有一个可以上传到任何地方的管理员组或一个只能上传到某个路径的团队.

eca*_*lvo 7

经过一段时间的搜索后,我没有找到准备好的答案,所以我将发布到目前为止的内容.很高兴知道是否还有其他(更好)的方法.

由于我不想使用其他服务器,因此自定义身份验证令牌已经完成.但是,request.auth.uid可用于存储规则.uid属性与Auth区域中定义的用户之一匹配.您需要在存储规则中创建一个函数,以检查request.auth.uid是否在您定义的组中.

Firebase存储规则具有独特的语法.它看起来像javascript,但事实并非如此.您可以定义函数,但不能在其中声明var.此外,还有一些类似javascript的方法可用.

例如,我首先尝试了以下尝试失败:

function isAdmin() {
  return ["value","list"].indexOf(request.auth.uid) > -1;
}

service firebase.storage {...}
Run Code Online (Sandbox Code Playgroud)

当我尝试定义var OR时,规则编辑器抛出错误,当我使用.indexOf时,它总是返回"未授权".

以下结果为我工作.

function isAdmin() {
  return request.auth.uid in {
    "yaddayadddayaddUserIDKey":"User Name1"
  };
}
function isSomeOtherGroup() {
  return request.auth.uid in {
    "yaddayaddaSomeOtherUID":"User Name2",
    "YaddBlahBlahUID":"User Name3"
  };
}

service firebase.storage {
  match /b/<your bucket here>/o {
    match /{allPaths=**} {
      allow read, write: if isAdmin();
    }
    match /path/{allPaths=**} {
        allow read, write: if isSomeOtherGroup() || isAdmin();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Bir*_*ngh 6

我没有足够的声誉来评论@ecalvo 的回答。所以我添加了一个答案。该函数isAdmin()可以提供如下列表:

function isAdmin() {
   return request.auth !=null && request.auth.uid in [
        "uidAdmin1",
        "uidAdmin2",
        "uidOfOtherAdminsAsCommaSeparatedStrings"
    ];
}
Run Code Online (Sandbox Code Playgroud)

其余的实现可以从@ecalvo 的答案中借用。我觉得现在更清楚了。在@ecalvo 的回答中,我很困惑,当我只需要比较 uid 时,为什么要提供用户名。