首先登入:阿里云-上云就上阿里云
登入阿里云之后点击如下:
下一个鼠标放在右上角头像:
点击访问控制:进入RAM访问控制
注意!下面开始执行创建临时访问操作:
第一步:
点击左侧菜单:身份管理-用户-创建用户
用户名称自定义,显示名称为备注:如:临时用户
勾选OpenApi调用访问设置
点击确认,填写手机验证码;
临时用户创建完成;
注意!
用户创建完成后,跳出的列表页面不要返回
先把AccessKey ID 与 AccessKey Secret 记录下来 这两个很重要
或者列表页面有个下载CSV的按钮,把这个临时用户数据下载下来,以备使用;
第二步:
点击用户组:创建用户组
用户名称自定义,按照提示格式填写
显示名称为自定义,如临时临时用户授权访问组
点击确认,用户组创建完成
第三步:
点击左侧:身份管理-角色-创建角色
选择阿里云账号,点击下一步
输入角色名称,如:roleTest
选择信任云账号:当前账号 (如果有其他账号则先择其他账号)
点击完成
返回角色列表,找到刚刚创建的角色,点击详情页面,记录ARN(重点)
第四步:
点击左侧权限管理-权限策略-创建权限策略-选择脚本编辑
4.1:临时访问角色权限策略
之前创建的角色记录的ARN 就派上用场了
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "此处填写角色的ARN"
}
],
"Version": "1"
}
点击保存,输入自定义名称(如:TemporaryRoleAuthorization),输入显示名称
点击下一步,完成
4.2:临时访问权限策略(此处是创建开放访问权限策略)
继续点击创建权限策略-脚本编辑
{
"Version": "1",
"Statement": [
{
"Action": [
"rds:DescribeDBInstances",
"rds:DescribeDatabases",
"rds:DescribeAccounts",
"rds:DescribeDBInstanceNetInfo"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "ram:ListRoles",
"Effect": "Allow",
"Resource": "*"
},
{
"Action": "mns:ListTopic",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"dhs:ListProject",
"dhs:ListTopic",
"dhs:GetTopic"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"ots:ListInstance",
"ots:ListTable",
"ots:DescribeTable"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"log:ListShards",
"log:ListLogStores",
"log:ListProject"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
}
]
}
点击保存,输入自定义名称(如:RamTestPolicy),输入显示名称
点击下一步,完成
第五步:
5.1
点击用户组,找到刚刚创建的用户组,点击添加组成员,选择创建的临时用户,点击确认
5.2
点击用户组列表,添加权限
找到系统策略:AliyunSTSAssumeRoleAccess 添加
再点击自定义策略:搜索刚定义的:RamTestPolicy 策略 添加
点击确认,权限策略就绑定到用户组上了
第六步:
点击左侧身份管理-角色
在角色列表找到刚创建的角色:roleTest,点击右侧的添加权限
点击自定义策略 搜索:TemporaryRoleAuthorization 角色权限策略 选中添加
点击确认
目前为止,阿里云用户角色临时访问权限策略完成
最后一步,根据API 提供的获取临时令牌代码进行访问
此图创建桶,代码内有涉及到桶,例:OSS存储地址
代码访问使用到的参数有:
AccessKey ID,AccessKey Secret,roleARN,
@Value("${accessKeyId}")
private String accessKeyId;
@Value("${accessKeySecret}")
private String accessKeySecret;
@Value("${roleArn}")
private String roleArn;
@Value("${bucketName}")
private String bucketName;
@Value("${region}")
private String region;
public static final String REGION_CN_CHENGDU = "cn-chengdu";
public static final String STS_API_VERSION = "2015-04-01";
@ApiOperation(value = "阿里云角色临时授权")
@RequestMapping(value = "/authorization",method = RequestMethod.GET)
public oneDataResponse authorization(@LoginUser CurrentUser currentUser)throws com.aliyuncs.exceptions.ClientException {
if(StringUtils.isEmpty(currentUser) || StringUtils.isEmpty(currentUser.getId())){
throw new CustomException("临时授权失败,用户不存在!");
}
//定义临时访问权限
String policy ="{n" +
" "Version": "1", n" +
" "Statement": [n" +
" {n" +
" "Action": [n" +
" "oss:GetBucket", n" +
" "oss:PutObject", n" +
" "oss:GetObject", n" +
" "oss:ListParts" n" +
" ], n" +
" "Resource": [n" +
" "acs:oss:*:*:*"n" +
" ], n" +
" "Effect": "Allow"n" +
" }n" +
" ]n" +
"}";
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//生成随机用户名称
String s = "oss-policy-" + RandomStringUtils.random(4, str);
//此处3600L 是当前临时用户可访问的时长
AssumeRoleResponse response = assumeRole(accessKeyId,accessKeySecret, roleArn,
s, policy, 3600L, STS_PROTOCOL_TYPE);
ALiYunToolVO vo = new ALiYunToolVO();
vo.setBucketName(bucketName); //桶名称 对象存储OSS的Bucket列表 创建的Bucket的名称
vo.setRegion(region); //地区如:oss-cn-chengdu 每个地区不一样(替换chengdu即可)
vo.setExpiration(response.getCredentials().getExpiration());
vo.setAccessKeyId(response.getCredentials().getAccessKeyId());
vo.setAccessKeySecret(response.getCredentials().getAccessKeySecret());
vo.setSecurityToken(response.getCredentials().getSecurityToken());
return new OneDataResponse<>(vo);
}
public static final ProtocolType STS_PROTOCOL_TYPE = ProtocolType.HTTPS;
static AssumeRoleResponse assumeRole(String accessKeyId,String accessKeySecret, String roleArn,
String roleSessionName) throws com.aliyuncs.exceptions.ClientException {
return assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName, null, 3600,
STS_PROTOCOL_TYPE);
}
static AssumeRoleResponse assumeRole(String accessKeyId,String accessKeySecret, String roleArn,
String roleSessionName, String policy) throws com.aliyuncs.exceptions.ClientException {
return assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName, policy, 3600,
STS_PROTOCOL_TYPE);
}
static AssumeRoleResponse assumeRole(String accessKeyId,String accessKeySecret, String roleArn,
String roleSessionName, String policy, long expired, ProtocolType protocolType)
throws com.aliyuncs.exceptions.ClientException {
// 创建一个 Aliyun Acs Client, 用于发起 OpenAPI 请求
IClientProfile profile = DefaultProfile.getProfile(REGION_CN_CHENGDU,
accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// 创建一个 AssumeRoleRequest 并设置请求参数
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setVersion(STS_API_VERSION);
request.setMethod(MethodType.POST);
request.setProtocol(protocolType);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
request.setDurationSeconds(expired);
// 发起请求,并得到response
return client.getAcsResponse(request);
}
代码处:oneDataResponse 为自定义返回类型
请求成功返回结果
获取临时访问授权到此结束,参数可供前端上传等使用。



