AWS S3 策略中的特殊符号
special symbols in AWS S3 policies
我的服务器向客户端发出以下策略,因此他们可以列出存储桶中主目录的内容:
s3://abcd/public/USERNAME
在客户端,我使用 AWS api 和列出存储桶的策略。
使用普通单词一切正常,但是,当用户名包含字符 @ 时,我收到 FORBIDDEN 响应。
s3://abcd/public/@makeihan
我怀疑它干扰了那些亚马逊 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/*"
]
}
]
}
我需要两件事来解决这个问题,其中包括我使用的 SDK 中的一个错误:
1) 在 listObjects
请求中指定 encoding="url"
。未指定时,SDK 会转义密钥。当提供 "url" 时,SDK 使用原始密钥。 - 顺便说一句,这对我来说听起来有悖常理
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(S3_BUCKET)
.withDelimiter(DEFAULT_DELIMITER)
.withEncodingType("url") // THIS DOES THE MAGIC
.withPrefix(prefix);
2) 更新 AWS SDK。旧的 sdks 有一个关于这个的错误,所以像 PutObject
、GetObject
等其他方法再次重新编码密钥。
我的服务器向客户端发出以下策略,因此他们可以列出存储桶中主目录的内容:
s3://abcd/public/USERNAME
在客户端,我使用 AWS api 和列出存储桶的策略。
使用普通单词一切正常,但是,当用户名包含字符 @ 时,我收到 FORBIDDEN 响应。
s3://abcd/public/@makeihan
我怀疑它干扰了那些亚马逊 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/*"
]
}
]
}
我需要两件事来解决这个问题,其中包括我使用的 SDK 中的一个错误:
1) 在 listObjects
请求中指定 encoding="url"
。未指定时,SDK 会转义密钥。当提供 "url" 时,SDK 使用原始密钥。 - 顺便说一句,这对我来说听起来有悖常理
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(S3_BUCKET)
.withDelimiter(DEFAULT_DELIMITER)
.withEncodingType("url") // THIS DOES THE MAGIC
.withPrefix(prefix);
2) 更新 AWS SDK。旧的 sdks 有一个关于这个的错误,所以像 PutObject
、GetObject
等其他方法再次重新编码密钥。