как предоставить доступ к ведру amazon s3 только из моего приложения?

Не уверен, что это возможно, так как я только начинаю работать с Amazon S3.

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

Я использую этот обработчик s3 Coldfusion, но я Я не уверен, как правильно настроить его в отношении ACL, потому что только загружающий пользователь будет иметь доступ к корзине, а установка ACL на public read не заблокирует доступ к файлу пользователям, не являющимся приложениями.

Вопрос.
Можно ли предоставлять ACL на основе приложений?


person frequent    schedule 16.08.2012    source источник
comment
какой движок и версию CFML вы используете?   -  person Chris Blackwell    schedule 16.08.2012
comment
Все еще работает Coldfusion 8, MySQL 5.0.88.   -  person frequent    schedule 16.08.2012
comment
Я знаю, что с CF9+ это кажется проще, но на какое-то время я застряну на CF8.   -  person frequent    schedule 16.08.2012
comment
Вы пытаетесь создать корзину для каждого пользователя вашего приложения, не могли бы вы использовать одну корзину и поместить изображения каждого пользователя в отдельную папку?   -  person Chris Blackwell    schedule 16.08.2012
comment
хм. Прямо сейчас я делаю одно ведро на пользователя (не так много). Это лучше или хуже, чем создание папок для каждого пользователя внутри одной корзины?   -  person frequent    schedule 16.08.2012


Ответы (1)


Вы можете поместить ведра и объекты, которые разрешают доступ только владельцу, передав пустую строку acl. Под владельцем я подразумеваю владеющую учетной записью Amazon, а не пользователя в вашем приложении.

В этом примере создается одно ведро, а затем загружается изображение во вложенную папку.

<cfscript>
s3 = createobject("component", "s3").init(accessKeyId, secretAccessKey);
s3.putBucket("myapps-bucket", "");

s3.putObject(
    bucketName="myapps-bucket", 
    fileKey="image.png", 
    contentType="image/png", 
    acl="",                         
    keyName="user1234/image.png"
);
</cfscript>

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

<!--- signed link valid for 30 mins --->
<cfset link = s3.getObject(bucket, "user1234/image.png", 30) />
<cfoutput>
    <img src="#link#" />
</cfoutput>

В настоящее время возможно иметь только 100 сегментов на аккаунт Amazon, поэтому я рекомендовал бы использовать папку для каждого пользователя, а не отдельные ведра.

person Chris Blackwell    schedule 16.08.2012
comment
Прохладный. Спасибо за информацию. Таким образом, единственный элемент, подписывающий ссылку, - это 30 (минут)? Начинаю искать информацию о папке :-) - person frequent; 16.08.2012
comment
да, getObject() принимает период действия в минутах. вы можете установить его ниже, если изображение будет отображаться немедленно. - person Chris Blackwell; 16.08.2012
comment
О папках. Это не официально от S3, не так ли? Я нахожу только то, что загружаю фиктивные файлы для создания папок. У вас есть ссылка на что-то действительное? - person frequent; 16.08.2012
comment
В моем примере выше просто используйте косую черту (/) в имени файла - person Chris Blackwell; 16.08.2012
comment
вы увидите, что папки появляются в консоли AWS S3, так что да, они официально поддерживаются - person Chris Blackwell; 16.08.2012
comment
В порядке. Итак, все мои файлы пользователя 12345 должны быть загружены как user12345/file.png? - person frequent; 16.08.2012
comment
да, в принципе, это все, что вам нужно сделать. S3.cfc имеет некоторые очень запутанные имена аргументов, которые не помогают, но аргумент keyName должен содержать имя папки и файла, которые вы хотите сохранить на Amazon. очевидно, вы можете выбрать любое соглашение об именах, которое хотите, и можете иметь несколько уровней папок, например. пользователи/12345/изображения/изображение.jpg - person Chris Blackwell; 16.08.2012
comment
что, если у меня несколько пользователей, и я не хочу, чтобы они имели доступ к файлам друг друга - person Paulo; 06.06.2018