有没有办法按组控制上传到Firebase存储中的路径?例如,有一个可以上传到任何地方的管理员组或一个只能上传到某个路径的团队。
经过一段时间的搜索后,我没有找到准备好的答案,所以我将发布到目前为止的内容。很高兴知道是否还有其他(更好)的方法。
由于我不想使用其他服务器,因此自定义身份验证令牌已经完成。但是,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 {...}
当我尝试定义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();
}
}
}
我没有足够的声誉评论@ ecalvo的答案。所以我要补充一个答案。函数isAdmin()
可以提供如下列表:
function isAdmin() {
return request.auth !=null && request.auth.uid in [
"uidAdmin1",
"uidAdmin2",
"uidOfOtherAdminsAsCommaSeparatedStrings"
];
}
其余的实现可以从@ecalvo的答案中借用。我觉得现在更清楚了。在@ecalvo的回答中,当我只需要比较uid时,我很困惑为什么要提供用户名。
您可以使用“自定义声明”:https://firebase.google.com/docs/auth/admin/create-custom-tokens
看到这个堆栈溢出答案:Firebase Storage Rules with Custom Claims
service firebase.storage {
match /b/{bucket}/o {
match /files/{authGroupName}/{fileName} {
allow read: if request.auth.token.authGroupName == authGroupName
}
}
}