OSS云存储的权限控制、开放接口规范和错误响应以及SpringBoot整合OSS
一、OSS云存储的权限控制
1、权限控制方式
针对存放在 Bucket 的 Object 的访问,OSS 提供了多种权限控制方式,包括 ACL、RAM Policy 和Bucket Policy。
- ACL:OSS 为权限控制提供访问控制列表(ACL)。ACL是基于资源的授权策略,可授予 Bucket和 Object 访问权限。 可以在创建 Bucket 或上传 Object 时设置 ACL,也可以在创建 Bucket或上传Object 后的任意时间内修改 ACL。
- RAM Policy:RAM (Resource Access Management)是阿里云提供的资源访问控制服务。RAMPolicy 是基于用户的授权策略。
- Bucket Policy:Bucket Policy 是基于资源的授权策略。相比于 RAM Policy,Bucket Policy 操作简单,支持在控制台直接进行图形化配置。
2、ACL
-
Bucket ACL
Bucket ACL是 Bucket 级别的权限访问控制。目前有三种访问权限:public-read-write,publicread 和 private,含义如下:
操作方式
-
Object ACL
Object ACL是Object 级别的权限访问控制。目前有四种访问权限:private、public-read、publicread-write、default。PutObjectACL 操作通过 Put 请求中的 x-oss-object-acl 头来设置,这个操作只有 Bucket Owner 有权限执行。
Object ACL 的四种访问权限含义如下:
操作方式和上面类似 参考官方文档即可
https://help.aliyun.com/document_detail/100676.html?spm=a2c4g.11186623.2.9.695b5a5bnz0mcm#concept-blw-yqm-2gb
3、RAM Policy
RAM(Resource Access Management)是阿里云提供的资源访问控制服务,RAM Policy是基于用户的授权策略。使用RAM,您可以创建、管理RAM用户,并可以控制这些RAM用户对资源的操作权限。当您的企业存在多用户协同操作资源时,使用RAM可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,管理更加方便,权限更加明确,信息更加安全。
注意
- 如果您选择使用RAM Policy,建议您通过官方工具RAM策略编辑器快速生成所需的RAM Policy。
- RAM Policy操作比较复杂,强烈推荐您使用简单易用的图形化配置方式Bucket Policy。
https://help.aliyun.com/document_detail/102600.html?spm=a2c4g.11186623.6.693.143258f6f33HST
4、Bucket Policy
Bucket Policy是基于资源的授权策略。相比于RAM Policy,Bucket Policy支持在控制台直接进行图形化配置操作,并且Bucket拥有者直接可以进行访问授权。
Bucket Policy常见的应用场景如下:
- 向其他账号的RAM用户授权访问。
您可以授予其他账号的RAM用户访问您的OSS资源的权限。 - 向匿名用户授予带特定IP条件限制的访问权限。
某些场景下,您需要向匿名用户授予带IP限制的访问策略。例如,企业内部的机密文档,只允许在企业内部访问,不允许在其他区域访问。由于企业内部人员较多,如果针对每个人配置RAMPolicy,工作量非常大。此时,您可以基于Bucket Policy设置带IP限制的访问策略,从而高效方便地进行授权。
Bucket Policy的配置方法和教程视频请参见使用Bucket Policy授权其他用户访问OSS资源
二、OSS存储开放接口规范 和 错误响应
1、开放接口规范
开发者在发送请求给 OSS 时,既可以使用 带签名认证的请求,也可以使用匿名访问。OSS提供的相关API接口如下
关于Service操作
关于Bucket的操作
关于Object的操作
关于Multipart Upload的操作
跨域资源共享(CORS)
关于Live Channel的操作
案例剖析
从上面的请求中 挑选任意接口分析
createBucket 创建Bucket
putObject 上传Object
getObject 下载Object
2、OSS云存储错误响应
当用户访问OSS出现错误时,OSS会返回给用户相应的错误码和错误信息,便于用户定位问题,并做出适当的处理
- OSS的错误响应格式
当用户访问OSS出错时,OSS会返回给用户一个合适的3xx,4xx或者5xx的HTTP状态码;以及一个application/xml格式的消息体。
错误响应的消息体例子:
<?xml version="1.0" ?>
<Error xmlns=”http://doc.oss.aliyuncs.com”>
<Code>
AccessDenied
</Code>
<Message>
Query-string authentication requires the Signature, Expires and
OSSAccessKeyId parameters
</Message>
<RequestId>
1D842BC5425544BB
</RequestId>
<HostId>
oss.aliyuncs.com
</HostId>
</Error>
所有错误的消息体中都包括以下几个元素:
- Code:OSS返回给用户的错误码。
- Message:OSS给出的详细错误信息。
- RequestId:用于唯一标识该次请求的UUID;当你无法解决问题时,可以凭这个RequestId来请求OSS开发工程师的帮助。
- HostId:用于标识访问的OSS集群(目前统一为oss.aliyuncs.com)
-
OSS的错误码
-
请求一个需要Referer字段的Object
https://xxx-imgs.oss-cn-beijing.aliyuncs.com/1.png -
OSS参数不支持的操作
如果在OSS合法的操作中,添加了OSS不支持的请求头参数(例如在PUT的时候,加入If-ModifiedSince参数),OSS会返回501 Not Implemented错误
错误请求示例:
PUT /my-image.jpg HTTP/1.1
Host:oss-example. oss.aliyuncs.com
Date: Wed, 28 May 2011 22:32:00 GMT
If-Modified-Since: Wed, 06 Apr 2011 10:02:46 GMT
返回示例:
501 Not Implemented
x-oss-request-id: 77E534EBF90372BE
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 28 Apr 2011 08:03:07 GMT
Connection: close
Server: AliyunOSS
<?xml version="1.0" ?>
<Error xmlns=”http://doc.oss.aliyuncs.com”>
<Code>
NotImplemented
</Code>
<Message>
A header you provided implies functionality that is not implemented.
</Message>
<Header>
If-Modified-Since
</Header>
<RequestId>
77E534EBF90372BE
</RequestId>
<HostId>
oss.aliyuncs.com
</HostId>
</Error>
- OSS不支持的操作
如果试图以OSS不支持的操作来访问某个资源,返回405 Method Not Allowed错误
错误请求示例:
abc / HTTP/1.1
Host:oss-example. oss.aliyuncs.com
Date: date
Authorization: signatureValue
返回示例:
x-oss-request-id: 2403382433A2EDA8
Allow: GET, DELETE, HEAD, PUT
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 31 Mar 2011 10:01:52 GMT
Server: AliyunOSS
<?xml version="1.0" ?>
<Error xmlns=”http://doc.oss.aliyuncs.com”>
<Code>
MethodNotAllowed
</Code>
<Message>
The specified method is not allowed against this resource.
</Message>
<ResourceType>
BUCKET
</ResourceType>
<Method>
abc
</Method>
<RequestId>
2403382433A2EDA8
</RequestId>
<HostId>
oss.aliyuncs.com
</HostId>
</Error>
三、OSS云储存代码案例
1、SpringBoot整合OSS上传
- 需求描述
使用SpringBoot完成上传图片 - 配置文件
pom.xml
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
application.properties
# Spring boot application
#server.servlet.context-path=/oss-server
server.port = 8999
#logging.level.root=DEBUG
aliyun.properties
aliyun.endpoint=http://oss-cn-beijing.aliyuncs.com
aliyun.accessKeyId=xxxxx
aliyun.accessKeySecret=xxxxx
aliyun.bucketName=xxxxx
aliyun.urlPrefix=https://xxxxx.oss-cn-beijing.aliyuncs.com/
- 编码实现
AliyunConfig
@Configuration
@PropertySource("classpath:aliyun.properties")
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private String urlPrefix;
@Bean
public OSSClient oSSClient() {
return new OSSClient(endpoint, accessKeyId, accessKeySecret);
}
}
实体对象
@Data
public class UpLoadResult {
// 文件唯一标识
private String uid;
// 文件名
private String name;
// 状态有:uploading done error removed
private String status;
// 服务端响应内容,如:'{"status": "success"}'
private String response;
}
FileUpLoadService
@Service
public class FileUpLoadService {
@Autowired
private AliyunConfig aliyunConfig;
@Autowired
private OSSClient ossClient;
// 允许上传的格式
private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",".jpeg", ".gif", ".png"};
public UpLoadResult upload(MultipartFile uploadFile) {
// 校验图片格式
boolean isLegal = false;
for (String type : IMAGE_TYPE) {
if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),type)) {
isLegal = true;
break;
}
}
UpLoadResult uploadResult = new UpLoadResult();
if (!isLegal) {
uploadResult.setStatus("error");
return uploadResult;
}
String fileName = uploadFile.getOriginalFilename();
String filePath = getFilePath(fileName);
try {
ossClient.putObject(aliyunConfig.getBucketName(),filePath, new
ByteArrayInputStream(uploadFile.getBytes()));
} catch (IOException e) {
e.printStackTrace();
//上传失败
uploadResult.setStatus("error");
return uploadResult;
}
uploadResult.setStatus("done");
uploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);
uploadResult.setUid(String.valueOf(System.currentTimeMillis()));
return uploadResult;
}
private String getFilePath(String sourceFileName) {
DateTime dateTime = new DateTime();
return "images/" + dateTime.toString("yyyy")
+ "/" + dateTime.toString("MM") + "/"
+ dateTime.toString("dd") + "/" + UUID.randomUUID().toString() +"." + StringUtils.substringAfterLast(sourceFileName, ".");
}
}
UpLoadController 控制器
@RequestMapping("/pic")
@Controller
public class UpLoadController {
@Autowired
private FileUpLoadService fileUpLoadService;
@PostMapping("/upload")
@ResponseBody
public UpLoadResult upload(@RequestParam("file") MultipartFile multipartFile) {
return this.fileUpLoadService.upload(multipartFile);
}
}
2、数据处理
- 介绍
阿里云OSS为在云上的数据打通了一个处理与使用的快速通道。通过简单的 RESTful 接口,可以在任何时间、任何地点、任何互联网设备上对存储在OSS中的数据进行分析处理。
数据处理包含以下两种:
- 阿里云OSS原生处理服务
阿里云OSS原生处理服务包括图片处理和视频截帧,其中图片处理包括图片的缩略、剪裁、参数调节等。 OSS原生处理服务无需开通,默认集成在OSS中,创建完Bucket后即可使用。产生的数据处理费用直接在OSS上结算。 - 智能媒体管理服务
阿里云OSS与智能媒体管理(IMM)深度结合,支持文档预览、文档格式转换、人脸识别、图片分析、二维码识别等丰富的数据分析处理操作。
- 图片处理
如何快速使用OSS图片处理服务。您可以通过三种方式处理图片:为图片URL添加参数进行单次处理、使用图片样式对不同图片进行相同处理,或使用OSS SDK对图片进行处理
- 视频截祯
注意事项
当前仅支持对视频编码格式为H264的视频文件进行视频截帧。
OSS当前没有默认保存视频截帧的操作,视频截帧的图片需手动下载到本地。
参数说明
操作名称:snapshot
https://help.aliyun.com/document_detail/64555.html
- 音视频处理
存储在OSS上的多媒体音视频数据,可以通过经济、弹性、高扩展的阿里云媒体转码服务,转换成适合在移动端、PC、TV上播放的格式。
媒体转码核心能力包括:
- 转换媒体格式,支持多平台播放。
- 保证相同画质质量的前提下,调整视频码率、提高视频压缩效率、减小文件体积,从而减少播放卡顿并节省存储空间和流量费用。
- 添加水印logo,突出品牌,增加产品识别度。
- 对视频进行剪辑/拼接等二次创作。
- 针对画质较差的视频,去除画面中的毛刺、马赛克等,修复为高清晰版本。![]imges\音视频处理.jpg)
https://help.aliyun.com/document_detail/65583.html
- 智能媒体管理(IMM)
阿里云 OSS 能够与智能媒体管理(IMM)深度结合,支持文档预览、文档格式转换、人脸识别、图片分析、二维码识别等丰富的数据分析处理操作。下面介绍如何在 OSS 控制台中使用 IMM 的功能。
前提条件
- 要在 OSS 中使用 IMM 功能,您需要开通 IMM 服务并进行授权。有关开通服务及授权的详细步骤,请参见开通产品及创建项目中的前提条件部分。
- 如果您使用 RAM 子账号进行本文中的操作,需要同时开通对应存储空间的访问权限和AliyunIMMFullAccess 权限。
- 创建 IMM Project 及使用 IMM 功能会产生一定的费用,如果您不需要使用 IMM 的功能,请及时解绑 IMM。详细费用请参见计费说明。
3、CDN 加速 (阿里 网宿 微软 亚马逊 akmai)
对象存储OSS与阿里云CDN服务结合,可优化静态热点文件下载加速的场景(即同一地区大量用户同时下载同一个静态文件的场景)。您可以将OSS的存储空间(Bucket)作为源站,利用阿里云CDN将源内容发布到边缘节点。当大量终端用户重复访问同一文件时,可以直接从边缘节点获取已缓存的数据,提高访问的响应速度。