My logo
Published on

常用云原生的文件存储服务

1、阿里云 OSS 子账号配置STS

帮助链接:

什么是STS

STS 接入地址

获取AssumeRole地址

设置跨域访问地址

  1. 进入阿里云OSS 控制台,找到RAM 管理中心
  2. 创建用户 (https://ram.console.aliyun.com/roles/xxxRole)
  3. 在权限管理里面选择权限策略管理,然后在创建权限策略

oss oss oss oss

策略代码

{

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "oss:*",

            "Resource": [

                "acs:oss:*:*:xxx-bucket/*"

            ]

        }

    ],

    "Version": "1"

}

3.然后接着在权限管理里面选择授权,输入需要新建的用户这里进行授权 4.创建RAM 角色管理,在生成STS 的时候是需要到的

oss oss

🔊🔊 注意:配置完成OSS 的一定要给用户配置又STS 的生成权限,不然是使用不了的, 可以将AliyunSTSAssumeRoleAccess 配置到自己定义的RAM 角色当中。

oss oss oss

添加前端跨域规则:选择对应的桶--->设置---->跨域

oss

2、 华为云 OBS 子账号配置 STS

统一身份认证服务 IAM

Api 接口调试页面

设置跨域访问:

2.1创建用户并且加入用户组

oss oss

2.2 没有可以创建一个,新建权限,创建自己的策略

oss

{
    "Version": "1.1",
    "Statement": [
        {
            "Action": [
                "obs:object:*"
            ],
            "Resource": [
                "obs:*:*:object:xxx-bucket/*"
            ],
            "Effect": "Allow"
        }
    ]
}

2.3 用户组里面配置权限管理,需要生成私钥密钥使用。

oss

2.4 获取账号、IAM用户、项目、用户组、区域、委托的名称和ID

oss

注意:OBS 生成STS 临时凭证必须使用子账号的账号,密码和主账号的id

三, 腾讯云 COS 子账号配置STS

临时密钥生成及使用指引

授权子账号访问cos

跨域访问设置:

3.1 授权子账号访问cos

操作步骤

授权子账号访问 COS 分为三个步骤:创建子账号、对子账号授予权限、子账号访问 COS 资源。

步骤1:创建子账号

在 CAM 控制台可创建子账号,并配置授予子账号的访问权限。具体操作如下所示:

  1. 登录 CAM 控制台
  2. 选择【用户】>【用户列表】>【新建用户】,进入新建用户页面。
  3. 单击【自定义创建】,选择可访问资源并接收消息类型,然后下一步。
  4. 按照要求填写用户相关信息。
    • 用户名:输入子用户名称,例如 Sub_user。
    • 邮箱:您需要为子用户添加邮箱来获取由腾讯云发出的绑定微信的邮件。
    • 访问方式:选择编程访问和腾讯云控制台访问。
  5. 填写用户信息完毕后,单击【下一步】,进行身份验证。
  6. 身份验证完毕,设置子用户权限。根据系统提供的策略选择,可配置简单的策略,例如 COS 的存储桶列表的访问权限,只读权限等。如需配置更复杂的策略,可进行 步骤2:对子账号授予权限
  7. 确认输入的用户信息无误后,单击【完成】即可创建子账号。
  8. 注意:这里只要选择 QcloudCOSFullAccess 这个权限就可以了 使用默认的就可以了。

oss

步骤2:对子账号授予权限

对子账号授予权限可通过 CAM,对子账号(用户)或用户组进行策略配置。

  1. 登录 CAM 控制台
  2. 选择【策略】>【新建自定义策略】>【按策略语法创建】,进入策略创建页面。
  3. 可供选择的模版有空白模板和与 COS 相关联的预设策略模板,选择您需要授予子账号的策略模板,单击【下一步】。

oss

4.输入便于您记忆的策略名称,若您选择空白模板,则需要输入您的策略语法,详情请参见 策略示例。您可将策略内容复制粘贴到【编辑策略内容】输入框内,单击【创建策略】。

oss

5.创建完成后,将刚才已创建的策略关联到子账号。

oss

步骤3:子账号访问 COS 资源

COS 访问(API 或 SDK)需要如下资源:APPID、SecretId、SecretKey。 当使用子账号访问 COS 资源时,需要使用主账号的 APPID,子账号的 SecretId 和 SecretKey,您可以在访问管理控制台生成子账号的 SecretId 和 SecretKey。

  1. 主账号登录 CAM 控制台
  2. 选择【用户列表】,进入用户列表页面。
  3. 单击子账号用户名称,进入子账号信息详情页。
  4. 单击【API 密钥】页签,并单击【新建密钥】为该子账号创建 SecretId 和 SecretKey。

注意 需要在下面桶配置权限才可以外网访问:

oss oss

3、快速入门(基于spring-boot maven)

3.1  Maven Pom 文件配置

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
  </dependency>
  <!-- 注意:这里是云存储组件需要的配置 csc-core 必须依赖 
			 下面组件可以按需要依赖 也可以全部依赖 具体项目使用是通过yml 或者 properties 文件
  		1.csc-oss-adapter 阿里云存储依赖 
      2.csc-cos-adapter 腾讯云存储依赖
      3.csc-obs-adapter 华为云存储依赖
	-->
  <dependency>
    <groupId>com.csc.inf</groupId>
    <artifactId>=csc-core</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </dependency>
  <dependency>
    <groupId>com.csc.inf</groupId>
    <artifactId>csc-oss-adapter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </dependency>
  <dependency>
    <groupId>com.csc.inf</groupId>
    <artifactId>csc-cos-adapter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </dependency>
  <dependency>
    <groupId>com.csc.inf</groupId>
    <artifactId>csc-obs-adapter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </dependency>
</dependencies>

3.2  yml 或者 properties 配置

注意:如果是基于spring boot 可以自动将配置文件转换为对象

@Component
@ConfigurationProperties(prefix = "csc")
public class AppCscRequest extends CscRequest {
}

如果不是spring boot 项目 则可以实现 CscRequest  将参数通过set 方法设置进去

csc:
  # 当前项目需要的存储组件
  apply: obs
  # 阿里云 OSS 需要的获取token 参数
  oss:
    endpoint: sts.cn-hangzhou.aliyuncs.com
    accessKeyId: ak
    accessKeySecret: sk
    roleArn: acs:ram::1830033224756929:role/xxxrole
    roleSessionName: xxxrole
    durationSeconds: 1000
    domain: https://xxx-bucket.oss-cn-guangzhou.aliyuncs.com
    bucketName: xxx-bucket
    # 不是必须 
    folderName:
    region: oss-cn-guangzhou.aliyuncs.com
  cos:
    # 腾讯云 COS 需要的获取token 参数
    bucket: xxx-bucket-1304902781
    region: ap-guangzhou
    SecretId: ak
    SecretKey: sk
    # 不是必须 
    allowPrefix:
    durationSeconds: 1800
    # 不是必须 
    folderName:
    server: xxx-bucket-1304902781
    domain: https://xxx-bucket-1304902781.cos.ap-guangzhou.myqcloud.com
  obs:
    # 华为云 OBS 需要的获取token 参数
    endpoint: https://iam.cn-south-1.myhuaweicloud.com
    accessKeyId: ak
    accessKeySecret: sk
    # 不是必须 如果生成STS就必须要
    userName: 子账号
    passWord: 子账号密码
    domainName: 主账号id hw*****
    durationSeconds: 900
    domain: https://xxx-bucket.obs.cn-south-1.myhuaweicloud.com
    bucketName: xxx-bucket
    # 不是必须 
    folderName:
    region: https://obs.cn-south-1.myhuaweicloud.com

3.4 前端获取STS 临时凭证

public class TestApi {

    // 通过spring noot 自动配置注入属性 
    // 也可以通过GET SET 方法设置
    @Autowired
    AppCscRequest cscRequest;

    // 获取 OSS STS token 统一封装
    @GetMapping(value = "token")
    public ResponseData<Object> token() throws IllegalAccessException {
        // 获取配置指定的云存储厂商
        String apply = cscRequest.getApply();
        // 通过SPI 获取到具体的云存储厂商实例
        HandleResourceApi resourceApi = HandleResourceFactory.build(apply);
        // 将获取的实体对象转换成MAP 参数形式
        Map<String, Object> map = ObjectMapUtils.objectToMap(cscRequest);
        // 统一的参数配置转换
        BaseConfig config = new BaseConfig(map);
        // 返回云存储厂商生成的STS 临时凭证返回给前端
        return resourceApi.getStsCredentials(config);
    }
 }

3.5 后端上传文件

public class TestApi {

    @Autowired
    AppCscRequest cscRequest;

    // 后台上传文件
    @PostMapping(value = "tokenUpload")
    public ResponseData<Object> tokenUpload(@RequestParam("file") MultipartFile file) throws Exception {
        String apply = cscRequest.getApply();
        HandleResourceApi resourceApi = HandleResourceFactory.build(apply);
        Map<String, Object> map = ObjectMapUtils.objectToMap(cscRequest);
        BaseConfig config = new BaseConfig(map);
        // 上传文件 folder 需要指定配置存储到云存储桶的位置
        String uuid = UUID.randomUUID().toString();
        String fileName = file.getOriginalFilename();
        String folder = "file/" + uuid + "_" + fileName;
        // 上传文件 folder 是指定存储object 的位置
        CscUploadResponse response = resourceApi.simpleUpload(config, folder, file.getInputStream());
        return new ResponseData<>(response);
    }
 }