使用STS临时访问凭证访问OSShttps://help.aliyun.com/document_detail/100624.html?spm=a2c4g.11186623.2.19.515649e8zOIom1#concept-xzh-nzk-2gb

一、 前置准备

您可以通过STS服务给其他用户颁发一个临时访问凭证。该用户可使用临时访问凭证在规定时间内访问您的OSS资源。临时访问凭证无需透露您的长期密钥,使您的OSS资源访问更加安全。

适用场景

假设您是一个移动App开发者,希望使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离。此时,您可以使用STS授权用户直接访问OSS。

使用STS授权用户直接访问OSS的流程如下:

  1. App用户登录。App用户和云账号无关,它是App的终端用户,App服务器支持App用户登录。对于每个有效的App用户来说,需要App服务器能定义出每个App用户的最小访问权限。
  2. App服务器请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,App服务器需要确定App用户的最小访问权限(用RAM Policy来自定义授权策略)以及凭证的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌(SecurityToken)。
  3. STS返回给App服务器一个临时访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间。
  4. App服务器将临时访问凭证返回给App客户端,App客户端可以缓存这个凭证。当凭证失效时,App客户端需要向App服务器申请新的临时访问凭证。例如,临时访问凭证有效期为1小时,那么App客户端可以每30分钟向App服务器请求更新临时访问凭证。
  5. App客户端使用本地缓存的临时访问凭证去请求OSS API。OSS收到访问请求后,会通过STS服务来验证访问凭证,正确响应用户请求。

步骤一:创建RAM用户

  1. 登录RAM控制台
  2. 在左侧导航栏,选择身份管理 > 用户。
  3. 单击创建用户。
  4. 输入登录名称和显示名称。
  5. 在访问方式区域下,选择Open API 调用访问,然后单击确定。
  6. 单击复制,保存访问密钥(AccessKey ID 和 AccessKey Secret)。

步骤二:为RAM用户授予请求AssumeRole的权限

  1. 单击已创建RAM用户右侧对应的添加权限。
  2. 在添加权限页面,选择AliyunSTSAssumeRoleAccess系统策略。

  3. 单击确定。

步骤三:创建用于获取临时访问凭证的角色

  1. 在左侧导航栏,选择身份管理 > 角色。
  2. 单击创建角色,选择可信实体类型为阿里云账号,单击下一步。
  3. 角色名称填写为RamOssTest,选择云账号为当前云账号。
  4. 单击完成。角色创建完成后,单击关闭。
  5. 在RAM角色管理页面,搜索框输入角色名称RamOssTest。
  6. 单击复制,保存角色的ARN。

步骤四:为角色授予上传文件的权限

  1. 创建上传文件的自定义权限策略。
    1. 在左侧导航栏,选择权限管理 > 权限策略。
    2. 单击创建权限策略。
    3. 在创建权限策略页面,单击脚本编辑,然后在策略文档输入框中赋予角色向目标存储空间examplebucket下的目录exampledir上传文件的权限。具体配置示例如下。

      警告 以下示例仅供参考。您需要根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。关于更细粒度的授权策略配置详情,请参见通过RAM或STS服务向其他用户授权

      {
          "Version": "1",
          "Statement": [
           {
                 "Effect": "Allow",
                 "Action": [
                   "oss:PutObject"
                 ],
                 "Resource": [
                   "acs:oss:*:*:examplebucket/exampledir",
                   "acs:oss:*:*:examplebucket/exampledir/*"
                 ]
           }
          ]
      }
    4. 策略配置完成后,单击下一步。
    5. 在基本信息区域,填写策略名称为RamTestPolicy,然后单击确定。
  2. 为RAM角色RamOssTest授予自定义权限策略。
    1. 在左侧导航栏,选择身份管理 > 角色。
    2. 在角色页面,找到目标RAM角色RamOssTest。
    3. 单击RAM角色RamOssTest右侧的添加权限。
    4. 在添加权限页面下的自定义策略页签,选择已创建的自定义权限策略RamTestPolicy。
    5. 单击确定。

二、引入依赖

         <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.14.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-sts</artifactId>
            <version>3.1.0</version>
        </dependency>

三、编写工具类

application.yaml配置文件统一配置,方便后期维护。

crm:
  #使用STS临时访问凭证访问OSS https://help.aliyun.com/document_detail/100624.html?spm=a2c4g.11186623.2.19.515649e8zOIom1#concept-xzh-nzk-2gb
  stsAccessKeyId: xxxxx
  stsAccessKeySecret: xxxxx
  stsRoleArn: acs:ram::xxxxx:role/xxxxx

 roleSessionName参数用于区分不同的sts令牌,根据需求填写。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.text.ParseException;


@Slf4j
@Service
public class StsSampleUtil {

    @Value("${crm.stsAccessKeyId}")
    private String stsAccessKeyId;
    @Value("${crm.stsAccessKeySecret}")
    private String stsAccessKeySecret;
    @Value("${crm.stsRoleArn}")
    private String stsRoleArn;

    public  AssumeRoleResponse.Credentials getStsMessage() throws IOException, ParseException {
        String endpoint = "sts.aliyuncs.com";
        String accessKeyId = stsAccessKeyId;
        String accessKeySecret = stsAccessKeySecret;
        String roleArn = stsRoleArn;
        String roleSessionName = "xxx";
        String policy = null;
        try {
            //构造default profile(参数留空,无需添加Region ID)
            IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
            //用profile构造client
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            request.setSysEndpoint(endpoint);
            request.setSysMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
            request.setDurationSeconds(60 * 60L); // 设置凭证有效时间
            request.setPolicy(policy);
            final AssumeRoleResponse response = client.getAcsResponse(request);
            AssumeRoleResponse.Credentials credentials = response.getCredentials();

            log.info("Access Key Id: " + credentials.getAccessKeyId());
            log.info("Access Key Secret: " + credentials.getAccessKeySecret());
            log.info("Security Token: " + credentials.getSecurityToken());
            log.info("RequestId: " + response.getRequestId());
            return credentials;
        } catch (ClientException e) {
            log.info("Failed:" + e.getStackTrace());
            log.info("Error code: " + e.getErrCode());
            log.info("Error message: " + e.getErrMsg());
            log.info("RequestId: " + e.getRequestId());
            return null;
        }
    }
}

四、编写接口并测试

    @Resource
    private StsSampleUtil stsSampleUtil;

    @PostMapping("/getStsMessage")
    @ApiOperation("获取临时访问凭证")
    public CommonResult<AssumeRoleResponse.Credentials> getStsMessage() throws IOException, ParseException {
        AssumeRoleResponse.Credentials stsMessage = stsSampleUtil.getStsMessage();
        return success(stsMessage);
    }

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐