#amazon-web-services #amazon-s3 #aws-sdk
#amazon-веб-сервисы #amazon-s3 #aws-sdk
Вопрос:
Мой сервер предоставляет клиентам приведенную ниже политику, чтобы они могли отображать содержимое своего домашнего каталога в корзине:
s3://abcd/public/USERNAME
Со стороны клиента я использую AWS api с политикой для составления списка сегментов.
Все отлично работает с обычными словами, однако, когда имя пользователя содержит символ @ , я получаю ЗАПРЕЩЕННЫЙ ответ.
s3://abcd/public/@makeihan
Я подозреваю, что это мешает этим функциям Amazon ARN, но, по-видимому, @ является допустимым и поддерживаемым символом в ключах (также пытался создавать объекты с консоли, и это работает нормально), интересно, могу ли я избежать его где-либо в политике, или этот символ не поддерживается?
Заранее благодарю.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::abcd"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"public/@makeihan/*",
]
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::abcd/public/@makeihan",
"arn:aws:s3:::abcd/public/@makeihan/*"
]
}
]
}
Комментарии:
1. Как насчет замены
@
на@
в политике?2. политики генерируются другой системой на основе утверждений о зашифрованных токенах … я не должен этого касаться : (
Ответ №1:
Для решения этой проблемы мне понадобились две вещи, в том числе ошибка в SDK, который я использовал:
1) укажите encoding="url"
в listObjects
запросе. Если не указано, SDK экранирует ключи. Когда указан «url», SDK использует исходные ключи. — кстати, для меня это звучит нелогично
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(S3_BUCKET)
.withDelimiter(DEFAULT_DELIMITER)
.withEncodingType("url") // THIS DOES THE MAGIC
.withPrefix(prefix);
2) Обновите AWS SDK. В старых SDK есть ошибка, касающаяся именно этого, поэтому остальные методы, такие как PutObject
, GetObject
и т.д., Снова перекодировали ключи.