Firebase Storage - Невозможно удалить с требованием размера

Я хотел бы разрешить пользователям загружать документы только в свое хранилище с максимальным размером файла 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]. Свойство ресурса не определено для объекта.

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

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

2 ответа

Решение

Догадаться! Вот что работает как в производстве, так и в симуляторе:)

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;
}

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

РЕДАКТИРОВАТЬ:

Кроме того, это работает как на симуляторе, так и на производстве (и, на мой взгляд, более читабельно, чем первый вариант). Спасибо @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;
}

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

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

Другие вопросы по тегам