Подписание URL-адреса Google Cloud Storage с целевыми учетными данными Java - PullRequest
0 голосов
/ 15 января 2020

ACL после загрузки объекта в Google Cloud Storage каждый раз перезаписывается.

Я создаю BlobInfo с предустановленным ACL, так что загруженный объект должен быть опубликован c read:

 String blobId = "PUBLIC/1";
 com.google.cloud.storage.BlobInfo info = com.google.cloud.storage.BlobInfo.newBuilder(RuntimeConfig.USERDATA_BUCKET_NAME, blobId)
                .setContentType(mimetype)
                .setMetadata(metadata)
                .setAcl(new ArrayList<>(Arrays.asList(Acl.of(Acl.User.ofAllUsers(), Acl.Role.READER)))) // <-- HERE
                .build();

После этого я подписываю URL, как это:

URL signedUrl = storage.signUrl(info, 30,
                    TimeUnit.MINUTES,
                    Storage.SignUrlOption.httpMethod(com.google.cloud.storage.HttpMethod.valueOf("PUT")),
                    Storage.SignUrlOption.withContentType());

Затем я загружаю файл из Интернета, и это прекрасно работает, только с одной проблемой - нет ACL с publi c read.

Конечно, я могу изменить ACL после завершения загрузки, например:

storage.createAcl(info.getBlobId(), (Acl.of(Acl.User.ofAllUsers(), Acl.Role.READER)));

Но есть ли способ установить его непосредственно в подписанном URL, без дополнительного триггера из Интернета после успешной загрузки?

Спасибо!

1 Ответ

0 голосов
/ 15 января 2020

Подписанные URL-адреса и ACL-списки (иначе. Списки контроля доступа)

Списки контроля доступа (ACL-списки) и Подписанные URL-адреса (аутентификация строки запроса) не одно и то же.

Хотя они оба обеспечивают контроль над тем, кто имеет доступ к вашим хранилищам и объектам облачного хранилища, а также на каком уровне доступа они имеют, Списки ACL предоставляют пользователям права на чтение или запись для отдельных групп или объектов . В большинстве случаев разрешения Cloud IAM используются поверх ACL, поскольку последние используются только тогда, когда требуется детальный контроль над отдельными объектами.

С другой стороны, Подписанные URL-адреса предоставляют ограниченный по времени доступ для чтения или записи к объекту через сгенерированный URL-адрес . Любой, у кого есть этот URL, будет иметь доступ к объекту в течение определенного периода времени, который указан.

Поэтому я не знаю ни одного способа реализации списков ACL непосредственно в подписанных URL-адресах для ответа на ваш вопрос.


Управление списками ACL

Из Документация :

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


Изменение значения по умолчанию ACL объекта

Следующий пример добавляет ACL объекта по умолчанию в корзину:

Acl acl = storage.createDefaultAcl(bucketName, Acl.of(User.ofAllAuthenticatedUsers(), Role.READER));

Следующий пример удаляет ACL объекта по умолчанию из корзины:

boolean deleted = storage.deleteDefaultAcl(bucketName, User.ofAllAuthenticatedUsers());
if (deleted) {
  // the acl entry was deleted
} else {
  // the acl entry was not found
}

Сведения о распространении

Если вы измените ACL объекта по умолчанию для сегмента , изменение может занять некоторое время, и новые объекты, созданные в сегменте, могут все еще получить старый объект ACL по умолчанию в течение короткого периода времени. Чтобы убедиться, что новые объекты, созданные в корзине, получают обновленный ACL по умолчанию для объекта, вам следует подождать не менее 30 секунд между изменением ACL объекта по умолчанию и созданием новых объектов .

...