|
|
|
@ -501,31 +501,69 @@ public class OssClient {
|
|
|
|
|
* @return 符合 AWS S3 存储桶访问策略格式的字符串
|
|
|
|
|
*/
|
|
|
|
|
private static String getPolicy(String bucketName, PolicyType policyType) {
|
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
|
builder.append("{\n\"Statement\": [\n{\n\"Action\": [\n");
|
|
|
|
|
builder.append(switch (policyType) {
|
|
|
|
|
case WRITE -> "\"s3:GetBucketLocation\",\n\"s3:ListBucketMultipartUploads\"\n";
|
|
|
|
|
case READ_WRITE -> "\"s3:GetBucketLocation\",\n\"s3:ListBucket\",\n\"s3:ListBucketMultipartUploads\"\n";
|
|
|
|
|
default -> "\"s3:GetBucketLocation\"\n";
|
|
|
|
|
});
|
|
|
|
|
builder.append("],\n\"Effect\": \"Allow\",\n\"Principal\": \"*\",\n\"Resource\": \"arn:aws:s3:::");
|
|
|
|
|
builder.append(bucketName);
|
|
|
|
|
builder.append("\"\n},\n");
|
|
|
|
|
if (policyType == PolicyType.READ) {
|
|
|
|
|
builder.append("{\n\"Action\": [\n\"s3:ListBucket\"\n],\n\"Effect\": \"Deny\",\n\"Principal\": \"*\",\n\"Resource\": \"arn:aws:s3:::");
|
|
|
|
|
builder.append(bucketName);
|
|
|
|
|
builder.append("\"\n},\n");
|
|
|
|
|
}
|
|
|
|
|
builder.append("{\n\"Action\": ");
|
|
|
|
|
builder.append(switch (policyType) {
|
|
|
|
|
case WRITE -> "[\n\"s3:AbortMultipartUpload\",\n\"s3:DeleteObject\",\n\"s3:ListMultipartUploadParts\",\n\"s3:PutObject\"\n],\n";
|
|
|
|
|
case READ_WRITE -> "[\n\"s3:AbortMultipartUpload\",\n\"s3:DeleteObject\",\n\"s3:GetObject\",\n\"s3:ListMultipartUploadParts\",\n\"s3:PutObject\"\n],\n";
|
|
|
|
|
default -> "\"s3:GetObject\",\n";
|
|
|
|
|
});
|
|
|
|
|
builder.append("\"Effect\": \"Allow\",\n\"Principal\": \"*\",\n\"Resource\": \"arn:aws:s3:::");
|
|
|
|
|
builder.append(bucketName);
|
|
|
|
|
builder.append("/*\"\n}\n],\n\"Version\": \"2012-10-17\"\n}\n");
|
|
|
|
|
return builder.toString();
|
|
|
|
|
String policy = switch (policyType) {
|
|
|
|
|
case WRITE -> """
|
|
|
|
|
{
|
|
|
|
|
"Version": "2012-10-17",
|
|
|
|
|
"Statement": []
|
|
|
|
|
}
|
|
|
|
|
""";
|
|
|
|
|
case READ_WRITE -> """
|
|
|
|
|
{
|
|
|
|
|
"Version": "2012-10-17",
|
|
|
|
|
"Statement": [
|
|
|
|
|
{
|
|
|
|
|
"Effect": "Allow",
|
|
|
|
|
"Principal": "*",
|
|
|
|
|
"Action": [
|
|
|
|
|
"s3:GetBucketLocation",
|
|
|
|
|
"s3:ListBucket",
|
|
|
|
|
"s3:ListBucketMultipartUploads"
|
|
|
|
|
],
|
|
|
|
|
"Resource": "arn:aws:s3:::bucketName"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"Effect": "Allow",
|
|
|
|
|
"Principal": "*",
|
|
|
|
|
"Action": [
|
|
|
|
|
"s3:AbortMultipartUpload",
|
|
|
|
|
"s3:DeleteObject",
|
|
|
|
|
"s3:GetObject",
|
|
|
|
|
"s3:ListMultipartUploadParts",
|
|
|
|
|
"s3:PutObject"
|
|
|
|
|
],
|
|
|
|
|
"Resource": "arn:aws:s3:::bucketName/*"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
""";
|
|
|
|
|
case READ -> """
|
|
|
|
|
{
|
|
|
|
|
"Version": "2012-10-17",
|
|
|
|
|
"Statement": [
|
|
|
|
|
{
|
|
|
|
|
"Effect": "Allow",
|
|
|
|
|
"Principal": "*",
|
|
|
|
|
"Action": ["s3:GetBucketLocation"],
|
|
|
|
|
"Resource": "arn:aws:s3:::bucketName"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"Effect": "Deny",
|
|
|
|
|
"Principal": "*",
|
|
|
|
|
"Action": ["s3:ListBucket"],
|
|
|
|
|
"Resource": "arn:aws:s3:::bucketName"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"Effect": "Allow",
|
|
|
|
|
"Principal": "*",
|
|
|
|
|
"Action": "s3:GetObject",
|
|
|
|
|
"Resource": "arn:aws:s3:::bucketName/*"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
""";
|
|
|
|
|
};
|
|
|
|
|
return policy.replaceAll("bucketName", bucketName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|