基于maven工程实践STS授权访问OSS

基于maven工程实践STS授权访问OSS

新建RAM用户

  1. 登录 RAM 控制台。
  2. 在左侧导航栏的人员管理菜单下,单击用户
  3. 单击新建用户,输入登录名称和显示名称。
    说明 单击添加用户,可一次性创建多个 RAM 用户。
  4. 访问方式区域下,选择控制台密码登录编程访问
- **控制台密码登录**:可以完成对登录安全的基本设置,包括自动生成或自定义登录密码、是否要求下次登录时重置密码以及是否要求开启多因素认证。
- **编程访问**:将会自动为 RAM 用户创建访问密钥(AccessKey)。RAM 用户可以通过 API 或其他开发工具访问阿里云。
  1. 说明 为了保障账号安全,建议仅为 RAM 用户选择一种登录方式。避免 RAM 用户离开组织后仍可以通过访问密钥访问阿里云资源。
  2. 单击确认

授权RAM用户AssumeRole接口权限

  1. 登录 RAM 控制台。
  2. 在左侧导航栏的人员管理菜单下,单击用户
  3. 在用户列表中找到刚才创建的用户,单击列表【操作】栏下的【添加权限】
  4. 在弹出对话框中的【系统权限策略】搜索并添加 AliyunSTSAssumeRoleAccess
  5. 单击确认

使用RAM Policy Editor 工具新建ListObject,GetObject权限策略文本

基于maven工程实践STS授权访问OSS_第1张图片

放行GetObject,ListObject 操作

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListObjects",
        "oss:GetObject"
      ],
      "Resource": [
        "acs:oss:*:*:fralychen"
      ],
      "Condition": {}
    }
  ]
}

放行 fralychen/Delete/*下的 DeleteObject操作

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "oss:Get*",
                "oss:list*",
                "oss:Put*"
            ],
            "Resource": [
                "acs:oss:*:*:*"
            ],
            "Condition": {}
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:DeleteObject"
            ],
            "Resource": [
                "acs:oss:*:*:fralychen/Delete/*"
            ],
            "Condition": {}
        }
    ]
}

通过CreatPolicy接口新建名为 OSS-Object Policy

基于maven工程实践STS授权访问OSS_第2张图片

通过CreatRole接口新建角色OSS-Object

新建允许扮演可信实体为云账号(AccountID=11498773245****:role)下被授权的RAM用户(oss-object)

基于maven工程实践STS授权访问OSS_第3张图片

{ “Statement”: [ {   “Action”: “sts:AssumeRole”,   “Effect”: “Allow”,   “Principal”: {     “RAM”: [       " acs:11498773245****:role/oss-object"     ]   } } ], “Version”: “1” }

通过AttachPolicyToRole为OSS-Object授权OSS-Object

基于maven工程实践STS授权访问OSS_第4张图片

通过STSAssumeRoleSessionCredentialsProvider接口返回临时凭证

注:这里使用SDK提供的Provider接口实现STS授权
aliyun-sdk-oss 3.7.0版本
            // STSAssumeRoleSessionCredentialsProvider接口通过 Aliyun Security Token Service(STS)服务,使用已经授权的角色(roleArn)完成角色扮演,获取一个临时凭证(credentialsProvider)。
            CredentialsProvider credentialsProvider = CredentialsProviderFactory
                .newSTSAssumeRoleSessionCredentialsProvider(regionId, accessKeyId,
                     accessKeySecret, roleArn)
                .withExpiredDuration(900);

OSSClientBuilder()可提供临时凭证参数传入 ,mvn-demo默认工程sdk版本不支持OSSClientBuilder()

/**
 * 示例说明
 * 
 * HelloOSS是OSS Java SDK的示例程序,您可以修改endpoint、accessKeyId、accessKeySecret、bucketName后直接运行。
 * 运行方法请参考README。
 * 
 * 本示例中的并不包括OSS Java SDK的所有功能,详细功能及使用方法,请参看“SDK手册 > Java-SDK”,
 * 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/。
 * 
 * 调用OSS Java SDK的方法时,抛出异常表示有错误发生;没有抛出异常表示成功执行。
 * 当错误发生时,OSS Java SDK的方法会抛出异常,异常中包括错误码、错误信息,详细请参看“SDK手册 > Java-SDK > 异常处理”,
 * 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response。
 * 
 * OSS控制台可以直观的看到您调用OSS Java SDK的结果,OSS控制台地址是:https://oss.console.aliyun.com/index#/。
 * OSS控制台使用方法请参看文档中心的“控制台用户指南”, 指南的来链接地址是:https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide。
 * 
 * OSS的文档中心地址是:https://help.aliyun.com/document_detail/oss/user_guide/overview.html。
 * OSS Java SDK的文档地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk。
 * 
 */

package com.aliyun.oss.demo;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.BasicCredentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;

import com.aliyun.oss.model.BucketInfo;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
// import junit.framework.Assert;

public class HelloOSS {
    static Logger logger = Logger.getLogger(HelloOSS.class);

    // endpoint是访问OSS的域名。如果您已经在OSS的控制台上 创建了Bucket,请在控制台上查看域名。
    // 如果您还没有创建Bucket,endpoint选择请参看文档中心的“开发人员指南 > 基本概念 > 访问域名”,
    // 链接地址是:https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html?spm=5176.docoss/user_guide/endpoint_region
    // endpoint的格式形如“http://oss-cn-hangzhou.aliyuncs.com/”,注意http://后不带bucket名称,
    // 比如“http://bucket-name.oss-cn-hangzhou.aliyuncs.com”,是错误的endpoint,请去掉其中的“bucket-name”。
    private static String endpoint = "oss-cn-hongkong.aliyuncs.com";
    private static String regionId = "cn-hongkong";

    // accessKeyId和accessKeySecret是OSS的访问密钥,您可以在控制台上创建和查看,
    // 创建和查看访问密钥的链接地址是:https://ak-console.aliyun.com/#/。
    // 注意:accessKeyId和accessKeySecret前后都没有空格,从控制台复制时请检查并去除多余的空格。
    private static String accessKeyId = "-";
    private static String accessKeySecret = "-";

    // roleArn是角色的全局资源描述符,用来指定具体角色。
    // 角色ARN基本概念和授权方式的链接地址是:https://help.aliyun.com/document_detail/93689.html?spm=a2c4g.11186623.6.583.26ba1d25iMA3Mp
    private static String roleArn = "acs:ram::1149877324567510:role/testrole";

    // Bucket用来管理所存储Object的存储空间,详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Bucket命名规范如下:只能包括小写字母,数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
    private static String bucketName = "fralychen";

    // Object是OSS存储数据的基本单元,称为OSS的对象,也被称为OSS的文件。详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Object命名规范如下:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。
    private static String firstKey = "my-first-key";
     public static void main(String[] args) {

        // 日志配置,OSS Java SDK使用log4j记录错误信息。示例程序会在工程目录下生成“oss-demo.log”日志文件,默认日志级别是INFO。
        // 日志的配置文件是“conf/log4j.properties”,如果您不需要日志,可以没有日志配置文件和下面的日志配置。
        PropertyConfigurator.configure("conf/log4j.properties");

        logger.info("Started");

        try {
            // STSAssumeRoleSessionCredentialsProvider接口通过 Aliyun Security Token Service(STS)服务,使用已经授权的角色(roleArn)完成角色扮演,获取一个临时凭证(credentialsProvider)。
            CredentialsProvider credentialsProvider = CredentialsProviderFactory
                .newSTSAssumeRoleSessionCredentialsProvider(regionId, accessKeyId,
                     accessKeySecret, roleArn)
                .withExpiredDuration(900);

            BasicCredentials credentials = (BasicCredentials) credentialsProvider.getCredentials();
            System.out.println(credentials.useSecurityToken());
            System.out.println(credentials.getAccessKeyId());
            System.out.println(credentials.getSecretAccessKey());
            System.out.println(credentials.willSoonExpire());

            
            // 生成OSSClient,您可以指定一些参数,详见“SDK手册 > Java-SDK > 初始化”,
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/init.html?spm=5176.docoss/sdk/java-sdk/get-start
            OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

            // 判断Bucket是否存在。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            if (ossClient.doesBucketExist(bucketName)) {
                System.out.println("您已经创建Bucket:" + bucketName + "。");
            } else {
                System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。");
                // 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
                // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
                ossClient.createBucket(bucketName);
            }

            // 查看Bucket信息。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            BucketInfo info = ossClient.getBucketInfo(bucketName);
            System.out.println("Bucket " + bucketName + "的信息如下:");
            System.out.println("\t数据中心:" + info.getBucket().getLocation());
            System.out.println("\t创建时间:" + info.getBucket().getCreationDate());
            System.out.println("\t用户标志:" + info.getBucket().getOwner());

            // 把字符串存入OSS,Object的名称为firstKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object
            InputStream is = new ByteArrayInputStream("Hello OSS".getBytes());
            ossClient.putObject(bucketName, firstKey, is);
            System.out.println("Object:" + firstKey + "存入OSS成功。");

            // 下载文件。详细请参看“SDK手册 > Java-SDK > 下载文件”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/download_object.html?spm=5176.docoss/sdk/java-sdk/manage_object
            OSSObject ossObject = ossClient.getObject(bucketName, firstKey);
            InputStream inputStream = ossObject.getObjectContent();
            StringBuilder objectContent = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            while (true) {
                String line = reader.readLine();
                if (line == null)
                    break;
                objectContent.append(line);
            }
            inputStream.close();
            System.out.println("Object:" + firstKey + "的内容是:" + objectContent);

            // 文件存储入OSS,Object的名称为fileKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object
            String fileKey = "README.md";
            ossClient.putObject(bucketName, fileKey, new File("README.md"));
            System.out.println("Object:" + fileKey + "存入OSS成功。");

            // 查看Bucket中的Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket
            ObjectListing objectListing = ossClient.listObjects(bucketName);
            List<OSSObjectSummary> objectSummary = objectListing.getObjectSummaries();
            System.out.println("您有以下Object:");
            for (OSSObjectSummary object : objectSummary) {
                System.out.println("\t" + object.getKey());
            }

            // 删除Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket
            ossClient.deleteObject(bucketName, firstKey);
            System.out.println("删除Object:" + firstKey + "成功。");
            ossClient.deleteObject(bucketName, fileKey);
            System.out.println("删除Object:" + fileKey + "成功。");
            
            ossClient.shutdown();

        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        logger.info("Completed");
    }

}

附:

maven Demon下载地址 aliyun-oss-java-sdk-demo-mvn.zip
工程的编译和运行方法,请参见工程目录下的README.md。

下载后请保持pom.xml文件中的aliyun-sdk-oss版本最新(3.7.0)


com.aliyun.oss

aliyun-sdk-oss

3.7.0


join US

未标题-1.png

基于maven工程实践STS授权访问OSS_第5张图片
暴走小二官方群,欢迎来躁

你可能感兴趣的:(阿里云,oss,STS授权访问,运维)