Есть ли способ управлять загрузками по пути в хранилище Firebase по группам? Например, у вас есть группа администраторов, которая может загружать файлы где угодно, или команду, которая может загружать файлы только по определенному пути.
Создать групповой доступ к хранилищу firebase без использования настраиваемой авторизации
Ответы (2)
Немного поискав, я не нашел готового ответа, поэтому опубликую то, что у меня есть. Было бы неплохо узнать, есть ли другие (лучшие) способы сделать это.
Поскольку я пытаюсь НЕ использовать другой сервер, пользовательские токены аутентификации отсутствуют. Однако request.auth.uid доступен для правил хранения. Свойство uid соответствует одному из пользователей, определенных в области Auth. Вам нужно будет создать функцию в правилах хранения, которая проверяет, находится ли request.auth.uid в определенной вами группе.
Правила хранения Firebase имеют уникальный синтаксис. Это вроде как javascript, но это не так. Вы можете определять функции, но не можете объявлять в них переменную. Кроме того, доступно подмножество методов, подобных javascript.
Например, я сначала безуспешно попробовал следующее:
function isAdmin() {
return ["value","list"].indexOf(request.auth.uid) > -1;
}
service firebase.storage {...}
Либо редактор правил выдавал ошибки, когда я пытался определить переменную, ИЛИ он всегда возвращал "unauthorized", когда я использовал .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.