关于阿里云oss对象存储含sts授权详解,java代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvhao2813/article/details/81185941

我在项目上需要使用一个阿里云的oss来进行图片的上传。看过oss的介绍和api之后,先写一个简单的代码。

maven地址引入jar 

<dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>.

public void uploadImage(String fileName, InputStream inputStream) throws IOException {
		// 创建OSSClient实例。
		OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
		// 创建上传Object的Metadata
		ObjectMetadata objectMetadata = new ObjectMetadata();
		objectMetadata.setContentLength(inputStream.available());
		objectMetadata.setCacheControl("no-cache");
		objectMetadata.setHeader("Pragma", "no-cache");
		objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
		objectMetadata.setContentDisposition("inline;filename=" + fileName);
		ossClient.putObject(bucketName, fileName, inputStream, objectMetadata);
		// 关闭OSSClient。
		ossClient.shutdown();

	}

endpoint是你创建的oss服务器的地址。比如  oss-cn-shenzhen.aliyuncs.com

accessKeyId 是你用户的key  accessKeySecret是你用户的密码

bucketName 你创建的存储空间

通过ossClient.putObject()即可上传。

那么下载呢。也是通过ossClient

// 设置URL过期时间
Date expiration = new Date(new Date().getTime() + 36000 * 1000 * 24 * 365 * 10);
// 生成原图URL
URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration);
		// 请求处理样式后的url
		String style = "image/resize,p_50";
		GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, fileName, HttpMethod.GET);
		req.setExpiration(expiration);
		req.setProcess(style);
		URL signedUrl = ossClient.generatePresignedUrl(req);

第一个url是我们获取原图的地址,该地址直接放在浏览器就可以看到啦~

第二个signedUrl是oss自带的图片处理功能,返回的一个url,如何处理呢,这里按照oss规定的格式设置,即可进行对应的处理。比如我这里resize,p_50就是缩小50%。

参考文档:https://help.aliyun.com/document_detail/47505.html?spm=a2c4g.11186623.6.715.pb7e6d

这样简单的上传下载就完成了。

但是给安全检测,发现一个安全大漏洞。。。在url中包含你的accessKeyId,这是非常不安全的。。。。于是阿里肯定会对安全你做处理的。。。

那么接下来,我就说一下,阿里这边的安全处理。

sts:我们仍然会使用一个带有accessKeyId的url,只不过这个url是以sts开头的一个临时授权的accessKeyId

接下来,就教大家如何去设置。

首先开通RAM,并创建一个RAM用户

ram用户代表什么呢,就相当于你的一个镜像,你可以给他分配权限。这里你需要给他分配,允许分配临时授权accessKeyId的权限sts。

这个RAM用户接下来就是你的接线员了。。程序代码中用的accessKeyId和密码就是该用户的。

之后新建一个角色

这个角色,它有什么权限,那么你分配的临时授权accessKeyId和密码和token就有什么权限。。

看代码。

public static final String REGION_CN_HANGZHOU = "cn-hangzhou";

private Map<String, String> stsService() throws ClientException {
		// 只有 RAM用户(子账号)才能调用 AssumeRole 接口 .
		// 阿里云主账号的AccessKeys不能用于发起AssumeRole请求
		// 首先在RAM控制台创建一个RAM用户,并为这个用户创建AccessKeys

		
		// 扮演角色的时候额外加上的一个权限限制,写法和授权策略一样
		String policy = null;
		// 可以为空 是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分
		String roleSessionName = "roleUser";
		// 临时凭证的有效期,单位是s,最小为900,最大为3600
		long sessionTime = 900;
		DefaultProfile.addEndpoint("", "", "Sts", endpoint);
		IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);

		// 用profile构造client
		DefaultAcsClient client = new DefaultAcsClient(profile);
		final AssumeRoleRequest request = new AssumeRoleRequest();
		request.setMethod(MethodType.POST);
		// 临时Token的会话名称,自己指定用于标识你的用户,主要用于区分Token颁发给谁
		// acs:ram::$accountID:role/$roleName
		request.setRoleArn(roleArn);
		request.setRoleSessionName(roleSessionName);
		request.setPolicy(policy);
		request.setDurationSeconds(sessionTime);
		// 发起请求,并得到response
		final AssumeRoleResponse response = client.getAcsResponse(request);
		System.out.println("Expiration: " + response.getCredentials().getExpiration());
		System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
		System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
		System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
		System.out.println("RequestId: " + response.getRequestId());
		Map<String, String> result = new HashMap<String, String>();
		result.put("accessKeyId", response.getCredentials().getAccessKeyId());
		result.put("accessKeySecret", response.getCredentials().getAccessKeySecret());
		result.put("tokenSecret", response.getCredentials().getSecurityToken());
		return result;
	}

这里有一个属性、、roleArn,他呢就是证明是哪个角色的。在角色管理中查询。

这里依然通过ossClient来回去url,不过是通过上面获得的key,密码和token

// 创建OSSClient实例。
 OSSClient ossClient = new OSSClient(endpoint, stsService.get("accessKeyId"), stsService.get("accessKeySecret"),
  stsService.get("tokenSecret"));

猜你喜欢

转载自blog.csdn.net/lvhao2813/article/details/81185941
今日推荐