Firebase Storage - Невозможно удалить с требованием размера - PullRequest
0 голосов
/ 17 января 2019

Я хотел бы разрешить пользователям загружать документы только в свое хранилище с максимальным размером файла 1 МБ, и при этом разрешать им удалять файлы. Я добавил следующее, которое:

match /myusers/{userId}/{allPaths=**} {
  allow write: if request.auth.uid == userId && request.resource.size < 1 * 1024 * 1024;
  allow read: if request.auth.uid == userId;
}

Я тестирую как на симуляторе, так и вживую в свой проект. Это не позволяет мне удалить документ (access denied). Если я удалю && request.resource.size < 1 * 1024 * 1024; из приведенного выше правила, документ можно будет удалить (но это не помешает загрузке файлов размером более 1 МБ.

Я подумал, что, возможно, он отклонил его, потому что request.resource - это null, поэтому я попробовал следующее:

match /myusers/{userId}/{allPaths=**} {
  allow write: if request.auth.uid == userId && (request.resource.size < 1 * 1024 * 1024 || request.resource == null);
  allow read: if request.auth.uid == userId;
}

Тем не менее удаление завершается со следующей ошибкой (в симуляторе):

Ошибка: строка simulator.rules [5], столбец [16]. Ресурс свойства объекта не определен.

enter image description here

Я рассмотрел все эти решения и изменил правило столько раз, сколько я могу придумать, но безрезультатно:

Кто-нибудь знает, как установить максимальный размер разрешенного файла, но все же разрешить удаление?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Разобрался! Вот что работает на производстве и в симуляторе:)

match /myusers/{userId}/{allPaths=**} {
  allow write: if request.auth.uid == userId && 
                  (request.resource.size < 1 * 1024 * 1024 || request.method == 'delete');
  allow read: if request.auth.uid == userId;
}

p.s. @ Дуг Стивенсон, если вы можете отправить заметку изнутри, я думаю, что для других было бы очень полезно, если бы request.method примеров с delete, update, get и / или create быть добавленным в документацию!

EDIT:

Кроме того, это работает как на симуляторе, так и на производстве (и, на мой взгляд, немного более читабельно, чем первый вариант). Спасибо @Doug Stevenson за подсказку!

match /myusers/{userId}/{allPaths=**} {
  allow write: if request.auth.uid == userId && request.resource.size < 1 * 1024 * 1024;
  allow delete: if request.auth.uid == userId 
  allow read: if request.auth.uid == userId;
}
0 голосов
/ 17 января 2019

Насколько я вижу, это просто ошибка в симуляторе консоли. Я написал реальный (Android) код приложения в соответствии с этими правилами и смог создать и удалить контент без проблем. Проблема в том, что симулятор не понимает, как интерпретировать request.resource == null, и в результате просто терпит неудачу.

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

...