通过STS方式访问DataHub

阿里云临时安全令牌(Security Token Service,STS)是阿里云提供的一种临时访问权限管理服务。通过STS服务,您所授权的身份主体(RAM用户或RAM角色)可以获取一个自定义时效和访问权限的临时访问令牌。STS令牌持有者可以通过编程方式或者调用OpenAPI获取临时安全令牌来访问DataHub。

示例代码

  1. 添加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>
  1. 参考示例:

  • 参数说明:

名称

类型

是否必选

示例值

描述

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。详情请参见CreateRoleUpdateRole

  • 您还需要在工程中配置相应的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;
    }
}