специальные символы в политиках AWS S3

#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 и т.д., Снова перекодировали ключи.