最近做了一個項目關於aliyun雲同步的功能。
結構如下
api層放向外暴露的接口和model類。
sdk層打包客戶端的實現類和工廠,向客戶暴露。
security層部署至服務器,不向外暴露。
jar包用到以下4個。
sts和ram是給第三方客戶(相對於aliyun而言),臨時訪問bucket的扮演角色(通過sts和ram包中提供的api,可以直接向相應OSS賬號申請臨時Token),Token中包含四個屬性,accessKeyID,accessKeySecret,secretToken,expiration。想要獲得臨時token,需要一個被賦予了RAM權限的OSS用戶的accessKeyID和accessKeySecret
其中OSS用戶的AccessKeySecret只會在第一次申請開通accessKey的時候提供給用戶(需保存)。
關於如何通過STS API與ALINYUN交互申請Token。過程如下:
public AssumeRoleResponse assumeRole(String assumeAccessKeyId,
String assumeAccessKeySecret, String roleArn,
String roleSessionName, String policy, ProtocolType protocolType)
throws RuntimeException {
try {
// 創建一個 Aliyun Acs Client, 用於發起 OpenAPI 請求
IClientProfile profile = DefaultProfile.getProfile(
REGION_CN_SHENZHEN, assumeAccessKeyId,
assumeAccessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// 創建一個 AssumeRoleRequest 並設置請求參數
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setMethod(MethodType.POST);
request.setProtocol(protocolType);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
request.setDurationSeconds(new Long(15 * 60));
// 發起請求,並得到response
final AssumeRoleResponse response = client.getAcsResponse(request);
return response;
} catch (ClientException e) {
throw new RuntimeException(e.getMessage());
}
}
ProtocolType protocolType = ProtocolType.HTTPS;
final AssumeRoleResponse response = assumeRole(tempAccessKeyID,
tempAccessKeySecret, roleArn, roleSessionName, policy,
protocolType);
Credentials credential = response.getCredentials();
取到了Token就有了臨時權限,通過Core和OSS 的Jar包中的API,無需通過服務器,直接和aliyun OSS交互。
關於<span style="font-family: Arial, Helvetica, sans-serif;">policy:</span>
policy是實現申請授權的一個策略。
需要開發者自己編寫。
policy = "{\"Version\": \"1\",\"Statement\": [{\"Action\": [\"oss:ListBuckets\"],\"Resource\": [\"acs:oss:*:*:*\"],\"Effect\": \"Allow\"},"
<span style="white-space:pre"> </span>+ "{\"Action\": [\"oss:ListObjects\"],\"Resource\": [\"acs:oss:*:*:bucket\",\"acs:oss:*:*:bucket/"
<span style="white-space:pre"> </span>+ policySessionName + "/*\"],\"Effect\": \"Allow\"}]}";
有關編寫規則可以在aliyun提供的api手冊中查詢。如上我寫了一個簡單的模板,可以查詢列出對應文件夾下的所有object,其中policySessionName是我自己寫的一個String,可以實現bucket中的文件夾形式。 bucket填你自己創建的即可。
P.S. 在這裏要注意\"bucket:ListObjects\",如果想要實現oss:ListObjects,必須先實現oss:ListBuckets。這是一個前提條件。