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