Создать групповой доступ к хранилищу firebase без использования настраиваемой авторизации

Есть ли способ управлять загрузками по пути в хранилище Firebase по группам? Например, у вас есть группа администраторов, которая может загружать файлы где угодно, или команду, которая может загружать файлы только по определенному пути.


person ecalvo    schedule 04.07.2016    source источник
comment
Связанные обсуждения: Руководство по защите данных пользователя (упоминается групповой подход), Группы, утверждения аутентификации и пользовательские токены групповое обсуждение.   -  person Kato    schedule 13.09.2017


Ответы (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();
    }
  }
}
person ecalvo    schedule 04.07.2016
comment
Я просто попробовал это решение, но по какой-то причине оно не работает. Были ли еще какие-то предостережения, которые вы обнаружили по пути? - person Tom 'Blue' Piddock; 23.01.2017
comment
Я использовал только аутентификацию адреса электронной почты. Я не пробовал использовать авторизацию в google или facebook. - person ecalvo; 07.02.2017

У меня недостаточно репутации, чтобы комментировать ответ @ ecalvo. Итак, я добавляю ответ. Для функции isAdmin() можно предоставить следующий список:

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

Остальную реализацию можно позаимствовать из ответа @ecalvo. Я чувствую, что теперь стало яснее. В ответе @ecalvo я был сбит с толку, почему я должен указывать имя пользователя, когда мне нужно сравнивать только uid.

person Birendra Singh    schedule 23.02.2017