2016-08-31 2 views
2

У меня есть основная «папка» в моем каталоге хранения users-projects, а затем я создаю папки для проектов каждого пользователя. Я хочу разрешить пользователям получать доступ только к их проектам и проектам, в которые они приглашены, например, к папке Dropbox или Google Диска с сотрудниками.Разрешить доступ к хранилищу для хранилища Firebase только для некоторых пользователей

В документации они говорят:

Включить группы информации (например, идентификатор группы или список разрешенного UID) в файл метаданных

Так вот мои вопросы:

  • Могу ли я сделать это непосредственно с помощью папки?
  • Как сохранить список разрешенных uid?

Я программирую приложение iOS в Swift.

Вот мой фактический код для правил:

service firebase.storage { 
    match /b/on-team.appspot.com/o { 
    match /{allPaths=**} { 
     allow read, write: if request.auth != null; 
    } 
    match /users-projects { 
     match /{projectId} { 
     allow read, write: if ????? 
     } 
    } 
    } 
} 

Вот официальная документация: https://firebase.google.com/docs/storage/security/user-security.

+0

Извините, если я допустил некоторые ошибки с языком ge, я итальянец. – ale00

ответ

4

Я думаю, что правильное статическое правило будет:

allow read, write: if request.auth.uid == 'a-user-id' || request.auth.uid == 'another-user-id' || ... 

Но я предполагаю, что вы ищете динамические правила :)

Для владельцев это довольно просто настроить динамическое правило с именем папки :

match /users-projects/{projectId}/{userId} { 
    allow read, write: if request.auth.uid == userId 

для более сложных случаев, как приглашенных пользователей, вы можете попробовать using the custom metadata хранить приглашенным UIDs в файле, и сопоставляют их ACCESSING ид пользователя, Ressource, например, правило:

allow read: if resource.metadata.invited.matches(request.auth.uid); 

Обычай значения метаданных могут быть только строки, поэтому я предлагаю вам хранить их в коме, разделенных значения, так что вы можете редактировать их легко, и в то же время использовать простой матч в правило доступа.

Примечание: это только масштабируемое значение, тогда как длина invitedUids.join(',') короче максимальной длины пользовательских значений метаданных. (Я не знаю этого значения). Если ваше приложение не создано для приема сотен приглашенных пользователей, оно должно быть в порядке, иначе вам может потребоваться настроить механизм доступа на стороне сервера, который создает уникальную ссылку для загрузки для каждого приглашенного пользователя вместо того, чтобы полагаться на простые правила.

Кроме того, я не думаю, что вы можете использовать маркер groupId значение для обеспечения безопасности доступа в вашем случае (как показано в документации), потому что у вас есть many-to-many отношения между пользователями и папками/файлами.(Пользователи не будут принадлежать только одной группе)

Таким образом, чтобы ответить на ваши вопросы:

  • resource объекта в правилах применяются только к файлам, при использовании метаданных для обеспечения доступа, они должны быть обновлены для каждого файла в папке, если они используют одни и те же правила доступа.
  • Метаданные - это просто строковое хранилище ключей ключей, вам просто нужно хранить идентификаторы пользователя в виде строки в произвольном незарезервированном ключе, как объяснено выше.
+0

Но я не хочу, чтобы это правило было жестко закодировано в файле правил. – ale00

+0

Обновлен мой ответ с правилом владельца – Pandaiolo

+0

. Я снова отредактировал свои ответы с подробностями о том, как использовать метаданные файла. – Pandaiolo

1

магазин индивидуальный проект в директории, используя их идентификатор пользователя

  • /пользователей-проекты/user_id/project1
  • /пользователей-проекты/user_id/project2


 service firebase.storage { 
     match /b/on-team.appspot.com/o { 
      match /{allPaths=**} { 
      allow read, write: if request.auth != null; 
      } 
     match /users-projects/{user_id} { 
      allow read, write: if request.auth.uid == user_id 
     } 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^