阿里云临时安全令牌(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;
}
}