使用的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编码:
%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上传文件:
楼主你好,看了你的问题,个人觉得是由于冒号是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);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
对象存储 OSS 是一款安全、稳定、高性价比、高性能的云存储服务,可以帮助各行业的客户在互联网应用、大数据分析、机器学习、数据归档等各种使用场景存储任意数量的数据,以及进行任意位置的访问,同时通过丰富的数据处理能力更便捷地使用数据。