STS临时授权访问OSS文件-java实现
1.说明
www.alibabacloud.com/help/zh/doc…
主要包含三个步骤: 1.创建用户 2.创建权限策略 3.创建RAM角色并授权
上述步骤皆在阿里云文档可以完成
2.导包
mavan导阿里云的sts 及 oss的依赖
<!-- aliyun sts begin-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sts</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.6</version>
</dependency>
<!-- aliyun sts end-->
3.通过AK SK URN获取STS
//调用部分
Map<String,Object> stsMap = getSTS(ALIYUN__AK,ALIYUN__SK,role);
getFileToLocal(stsMap,bucket);
upload(stsMap,bucket);
private Map<String,Object> getSTS(String aliyunAk, String aliyunSk, String aliyunUrn) {
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("success", false);
try {
IClientProfile profile = DefaultProfile.getProfile("", aliyunAk, aliyunSk);
// 用 profile 构造 client
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setSysMethod(MethodType.POST);
request.setRoleArn(aliyunUrn);
request.setRoleSessionName(ALIYUN_LINGXU_SESSIONNAME);
request.setSysEndpoint(ALIYUN_LINGXU_ENDPOINT);
//request.setDurationSeconds(3600L);
final AssumeRoleResponse response = client.getAcsResponse(request);
jsonMap.put("success", true);
jsonMap.put("Expiration", response.getCredentials().getExpiration());
jsonMap.put("Access Key Id", response.getCredentials().getAccessKeyId());
jsonMap.put("Access Key Secret", response.getCredentials().getAccessKeySecret());
jsonMap.put("Security Token", response.getCredentials().getSecurityToken());
jsonMap.put("RequestId", response.getRequestId());
} catch (ClientException e) {
jsonMap.put("message", e.getErrMsg());
jsonMap.put("RequestId", e.getRequestId());
}
return jsonMap;
}
}
4.根据STS,及bucket测试上传文件和下载文件
//上传
private void upload(Map<String, Object> stsMap, String bucketName) {
String filename = "E:\\road_status.sql";
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = stsMap.get("Access Key Id").toString();
String accessKeySecret = stsMap.get("Access Key Secret").toString();
String securityToken = stsMap.get("Security Token").toString();
String objectName = "1126ywwtest2";
// 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
// 创建OSSClient实例。
// OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
ossClient.putObject(bucketName, objectName, new File(filename));
ossClient.shutdown();
}
//下载
private void getFileToLocal(Map<String, Object> stsMap, String bucket) {
String filename = "student_data.csv";
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = stsMap.get("Access Key Id").toString();
String accessKeySecret = stsMap.get("Access Key Secret").toString();
String securityToken = stsMap.get("Security Token").toString();
String bucketName = bucket;
String objectName = filename;
// 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
// 创建OSSClient实例。
//OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
// OSS相关操作。例如上传、下载文件等。
// 上传文件。
// ossClient.putObject(putObjectRequest);
// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File("F:\\1126.csv"));
// 关闭OSSClient。
ossClient.shutdown();
}
参考
转载自:https://juejin.cn/post/6844904004913217544