阿里云臨時安全令牌(Security Token Service,STS)是阿里云提供的一種臨時訪問權限管理服務。通過STS服務,您所授權的身份主體(RAM用戶或RAM角色)可以獲取一個自定義時效和訪問權限的臨時訪問令牌。STS令牌持有者可以通過編程方式或者調用OpenAPI獲取臨時安全令牌來訪問DataHub。
示例代碼
添加Maven依賴
<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>
<dependency>
<groupId>com.aliyun.datahub</groupId>
<artifactId>aliyun-sdk-datahub</artifactId>
<version>2.19.0-public</version>
</dependency>
參考示例:
參數說明:
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
RoleArn | String | 是 | acs:ram::123456789012****:role/adminrole | 指定角色的ARN。格式:acs:ram::$accountID:role/$roleName 。 |
RoleSessionName | String | 是 | alice | 用戶自定義參數。此參數用來區分不同的令牌,可用于用戶級別的訪問審計。 長度為2~32個字符,可包含英文字母、數字、英文句點(.)、at(@)、短劃線(-)和下劃線(_)。 |
Policy | String | 否 | {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} | 權限策略。 生成STS Token時可以指定一個額外的權限策略,以進一步限制STS Token的權限。若不指定則返回的Token擁有指定角色的所有權限。 長度為1~1024個字符。 |
DurationSeconds | Long | 否 | 3600 | 過期時間,單位為秒。 過期時間最小值為900秒,最大值為MaxSessionDuration設置的時間。默認值為3600秒。 |
注意
$accountID:阿里云賬號ID。您可以通過登錄阿里云控制臺,將鼠標懸停在右上角頭像的位置,單擊安全設置進行查看。
$roleName:RAM角色名稱。您可以通過登錄RAM控制臺,單擊左側導航欄的RAM角色管理,在RAM角色名稱列表下進行查看。
您可以通過CreateRole或UpdateRole接口設置角色最大會話時間MaxSessionDuration。詳情請參見CreateRole或UpdateRole。
您還需要在工程中配置相應的AccessKey ID和AccessKey Secret。
datahub.endpoint=<yourEndpoint> datahub.accessId=<yourAccessKeyId> datahub.accessKey=<yourAccessKeySecret>
重要阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。
強烈建議不要將AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
import com.aliyun.datahub.client.DatahubClient;
import com.aliyun.datahub.client.DatahubClientBuilder;
import com.aliyun.datahub.client.auth.AliyunAccount;
import com.aliyun.datahub.client.common.DatahubConfig;
import com.aliyun.datahub.client.http.HttpConfig;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
public class AssumeRole {
//以華東1(杭州)region為例
private static final String regionId = "cn-hangzhou";
//子賬號AccessKey信息
@Value("${datahub.accessId}")
String accessId;
@Value("${datahub.accessKey}")
String accessKey;
//以賬號ID為198800131028****、roleName為admin為例
private static final String roleArn = "acs:ram::198800131028****:role/admin";
//sessionName:用戶自定義參數,用來區分不同的令牌
private static final String sessionName = "alice";
//以華東1(杭州)Region為例
private static final String endpoint = "http://dh-cn-hangzhou.aliyuncs.com";
public static void main(String[] args) {
AssumeRoleResponse.Credentials token = AssumeRole.getToken();
// 創建DataHubClient實例
DatahubClient datahubClient = DatahubClientBuilder.newBuilder()
.setDatahubConfig(
new DatahubConfig(endpoint,
new AliyunAccount(token.getAccessKeyId(), token.getAccessKeySecret(), token.getSecurityToken()
), true))
.setHttpConfig(new HttpConfig().setCompressType(HttpConfig.CompressType.LZ4)
.setConnTimeout(10000))
.build();
//初始化DataHubClient后即可訪問DataHub資源
}
/**
* 生成臨時訪問令牌
*/
private static AssumeRoleResponse.Credentials getToken() {
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessId, accessKey);
IAcsClient client = new DefaultAcsClient(profile);
//構造請求,設置參數。關于參數含義和設置方法,請查看 STS API參考。
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRoleArn(roleArn);
request.setRoleSessionName(sessionName);
try {
AssumeRoleResponse response = client.getAcsResponse(request);
return response.getCredentials();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
return null;
}
}