Правила безопасности Firebase Storage для папок - PullRequest
0 голосов
/ 09 июля 2020

Я создаю приложение android, в котором есть группы, а в хранилище Firebase есть пути, начинающиеся с / {groupId} / Images /, и я добавил правила безопасности с использованием метаданных файлов. Но правила не работают, когда я пытаюсь перечислить содержимое папки изображений, потому что для папки нет метаданных. Как решить эту проблему?

Есть ли способ получить доступ к произвольному изображению из папки «Изображения» в правилах безопасности и предоставить разрешение, просмотрев его метаданные. Кроме того, я не могу использовать специальные токены, потому что groupId не известен во время регистрации. В настоящее время написаны следующие правила безопасности:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{groupId}/Images/{allPaths=**} {
          allow read: if request.auth.uid in resource.metadata.keys() && groupId in resource.metadata.keys();
          allow write: if request.auth.uid in request.resource.metadata.keys() && groupId in request.resource.metadata.keys();
            
    }
  }
}

Код, в котором эти правила не работают:

storageReference = FirebaseStorage.getInstance().getReference();
StorageReference listRef = storageReference.child(groupId).child("Images");

listRef.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
      @Override
      public void onSuccess(ListResult listResult) {
           for (StorageReference prefix : listResult.getPrefixes()) {
                Log.d(TAG, "Storage reference prefix is: "+prefix);
           }

           for (StorageReference item : listResult.getItems()) {
                Log.d(TAG, "Storage reference item is: "+item);
           }
      }
      })
      .addOnFailureListener(new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception e) {
               Log.w(TAG, "listRef on storage failed: ",e);
           }
      });

1 Ответ

0 голосов
/ 09 июля 2020

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

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

В вашем коде, поскольку вы запрашиваете все файлы, запрос будет быть отклоненным. Если вы получите один конкретный файл c, правила могут проверять метаданные в этом файле и безопасно предоставлять / запрещать доступ к нему.

В Firestore и базе данных реального времени вы можете комбинировать, используя запрос в вашем коде с правилами, которые затем проверяют условия запроса и таким образом безопасно запрашивают данные. Но поскольку вы не можете выполнять запросы в облачном хранилище, вы не можете использовать этот подход в магазине. путь к файлам. Если вам нужно что-то большее, я бы рекомендовал реплицировать метаданные в базе данных, которая разрешает запрос, и безопасно запрашивать их там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...