使用的policy如下
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:PutObject",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:my-bucket/Test/user:123/*"
]
}
]
}
向 my-bucket/Test/user:123/a.txt 上传时
ByteArrayInputStream in = new ByteArrayInputStream("Hello OSS".getBytes());
stsClient.putObject("my-bucket", "Test/user:123/test.txt", in);
被权限拒绝
com.aliyun.oss.OSSException: Access denied by authorizer's policy.
但如果去掉冒号,或者授权资源改为my-bucket/Test/*
就一切正常,就是单独为带特殊符号的路径授权时无效
以下为热心网友提供的参考意见
这个问题是由于OSS的权限策略中,资源路径不能包含冒号(:)。你可以尝试将资源路径中的冒号替换为其他字符,例如下划线(_)或者短横线(-),然后再进行授权。
修改后的policy如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:PutObject",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:my-bucket/Test/user_123/*"
]
}
]
}
然后,你可以使用以下代码上传文件:
ByteArrayInputStream in = new ByteArrayInputStream("Hello OSS".getBytes());
stsClient.putObject("my-bucket", "Test/user_123/test.txt", in);
以下为热心网友提供的参考意见
您遇到的问题可能与OSS的URL编码规则有关。当您的资源路径包含特殊字符(如冒号)时,这些字符需要进行URL编码才能正确地作为授权策略中的资源。
要解决这个问题,您可以尝试以下方法:
-
使用URL编码:
- 在创建授权策略时,将特殊字符替换为其对应的URL编码。
- 对于冒号(:),其对应的URL编码是
%3A
。 - 将授权策略修改为如下形式:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:GetObject", "oss:DeleteObject" ], "Resource": [ "acs:oss:*:*:my-bucket/Test/user%3A123/*" ] } ] }
-
使用通配符:
- 如果您希望避免对所有特殊字符进行编码,可以考虑使用通配符(*)来匹配任意字符。
- 例如,您可以将授权策略中的资源部分改为
"acs:oss:*:*:my-bucket/Test/user*/*"
,这样就可以匹配到包含冒号的路径。
-
使用预签名URL上传文件:
- 如果您仍然无法通过STS客户端直接上传文件,还可以考虑使用预签名URL的方式来上传文件。
- 首先,使用STS客户端生成一个预签名URL,然后使用该URL直接上传文件。
以下为热心网友提供的参考意见
楼主你好,看了你的问题,个人觉得是由于冒号是URL中的保留字符,需要经过URL编码才能正确传递,你可以使用Java中的URLEncoder类对资源进行URL编码,然后将编码后的资源名称作为授权资源。
String encodedResource = URLEncoder.encode("my-bucket/Test/user:123/a.txt", "UTF-8");
String resource = "acs:oss:*:*:" + encodedResource;
policyObject.put("Resource", new String[] { resource });
然后在上传时,需要将文件名使用encodeURI或encodeURIComponent进行编码,以便能够在URL中正确地传递冒号字符。
String encodedFileName = encodeURIComponent("Test/user:123/a.txt");
ByteArrayInputStream in = new ByteArrayInputStream("Hello OSS".getBytes());
stsClient.putObject("my-bucket", encodedFileName, in);
本文来自投稿,不代表新手站长_郑州云淘科技有限公司立场,如若转载,请注明出处:https://www.cnzhanzhang.com/13841.html