在不使用自定义授权的情况下创建对 Firebase 存储的组访问权限
Create group access to firebase storage without using custom authorization
有没有办法按组控制上传到 Firebase 存储中的路径?
例如有一个可以在任何地方上传的管理员组或一个只能上传到特定路径的团队。
经过一番搜索后,我没有找到现成的答案,所以我会 post 目前已有的答案。很高兴知道是否有其他(更好的)方法可以做到这一点。
由于我尝试不使用其他服务器,因此自定义身份验证令牌已失效。但是,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 时规则编辑器抛出错误,或者当我使用 .indexOf.
时它总是返回 "unauthorized"
以下最终对我有用。
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 时,为什么要给出用户名。
有没有办法按组控制上传到 Firebase 存储中的路径? 例如有一个可以在任何地方上传的管理员组或一个只能上传到特定路径的团队。
经过一番搜索后,我没有找到现成的答案,所以我会 post 目前已有的答案。很高兴知道是否有其他(更好的)方法可以做到这一点。
由于我尝试不使用其他服务器,因此自定义身份验证令牌已失效。但是,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 时规则编辑器抛出错误,或者当我使用 .indexOf.
时它总是返回 "unauthorized"以下最终对我有用。
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 时,为什么要给出用户名。