AWS S3策略中的特殊符号

时间:2019-04-06 13:11:30

标签: amazon-web-services amazon-s3 aws-sdk

我的服务器向客户端发布以下策略,因此他们可以在存储桶中列出其主目录的内容:

s3://abcd/public/USERNAME

在客户端,我将AWS api与策略一起使用以列出存储桶。

所有命令都能正常使用单词,但是,当用户名包含@时,我会收到禁止响应。

s3://abcd/public/@makeihan

我怀疑它正在干扰亚马逊的那些ARN事物,但是显然@是键中的有效和受支持的字符(也尝试从控制台创建对象,并且可以正常工作),我想知道 I可以在策略中的任何地方对其进行转义,还是不支持此字符?

谢谢。

{
    "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 个答案:

答案 0 :(得分:2)

我需要两件事来解决此问题,其中包括我正在使用的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开发工具包。较旧的sdks与此有关,有一个错误,因此PutObjectGetObject等其他方法将再次对键进行重新编码。