OSS bucket权限设置
问题描述
调用oss的bucket资源,开始的时候可以访问,过几分钟再访问的时候,就提示拒绝访问
问题原因
是因为相应的bucket权限为私有,私有权限在访问文件对象时,是存在鉴权URL,存在时间有效性,所以时间过期后就会无法访问
只有该存储空间的拥有者可以对该存储空间内的文件进行读写操作,其他人无法访问该存储空间内的文件。
无法访问是指的程序中设定了只有该存储空间的拥有者可以去调用oss地址,针对用户侧是都可以访问的,只是多了一个鉴权策路
公网的话是针对用户侧来讲,程序里面是调oss的内网接口地址。如果程序和oss之间也走公网,这只是一个鉴权方式,是需要程序侧完成的。
解决思路
通过定期调用接口获取资源,可以使用SDK中的授权访问生成get请求的签名url 具体的操作步骤可参考这个文档
https://help.aliyun.com/document_detail/32016.html?spm=a2c4g.11174283.6.985.592a7da22GP6xt
解决方式
通过授权访问,使用STS以及签名URL临时授权访问OSS资源
1、使用STS临时授权
OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。
2、使用签名URL临时授权
2.1生成签名URL
您可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以通过指定URL的过期时间来限制访客的访问时长。
2.2生成以GET方法访问的签名URL
// Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 设置URL过期时间为1小时。 Date expiration = new Date(new Date().getTime() + 3600 * 1000); // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。 URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration); // 关闭OSSClient。 ossClient.shutdown();
私有权限的文件生成访问url是必须带过期时间的,并不能永久有效,通过OSS控制台获取文件URL时,主账号用户最长有效时间是32400秒(9小时),RAM用户(子账号用户)以及STS用户最长有效时间是3600秒(1小时)。如果要获取更长时效的文件URL,可以使用命令行工具ossutil、图形化工具ossbrowser或SDK
参考:https://help.aliyun.com/document_detail/39607.html