开发者社区 问答 正文

JavaScript-SDK之如何实现设置访问权限?

OSS允许用户对Bucket和Object分别设置访问权限,方便用户控制自己的资源可以被如何访问。对于Bucket,有三种访问权限:

  • public-read-write 允许匿名用户向该Bucket中创建/获取/删除Object
  • public-read 允许匿名用户获取该Bucket中的Object
  • private 不允许匿名访问,所有的访问都要经过签名

创建Bucket时,默认是private权限。之后用户可以通过putBucketACL来设置Bucket的权限,通过getBucketACL来获取Bucket的权限。 var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>'
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: '<Your bucket name>'
});
co(function* () {
  var result = yield client.getBucketACL('bucket-name');
  console.log(result);
  var result = yield client.putBucketACL('bucket-name', 'region', 'acl');
  console.log(result);
}).catch(function (err) {
  console.log(err);
});


对于Object,有四种访问权限:
  • default 继承所属的Bucket的访问权限,即与所属Bucket的权限值一样
  • public-read-write 允许匿名用户读写该Object
  • public-read 允许匿名用户读该Object
  • private 不允许匿名访问,所有的访问都要经过签名

创建Object时,默认为default权限。之后用户可以通过putACL来设置Object的权限。 var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>'
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: '<Your bucket name>'
});
co(function* () {
  var result = yield client.getACL('my-object');
  console.log(result.acl); // default
  yield client.putACL('my-object', 'public-read');
  var result = yield client.getACL('my-object');
  console.log(result.acl); // public-read
}).catch(function (err) {
  console.log(err);
});


需要注意的是:
  1. 如果设置了Object的权限(非default),则访问该Object时进行权限认证时会优先判断Object的权限,而Bucket的权限设置会被忽略。

  2. 允许匿名访问时(设置了public-read或者public-read-write权限),用户可以直接通过浏览器访问,例如:[backcolor=transparent] http[backcolor=transparent]:[backcolor=transparent]//bucket-name.oss-cn-hangzhou.aliyuncs.com/object.jpg

更多关于访问权限控制的内容请参考 访问控制

展开
收起
青衫无名 2017-10-19 09:45:33 1586 分享 版权
阿里云 AI 助理回答

阿里云对象存储(OSS)确实提供了灵活的访问控制机制,允许用户细致地管理Bucket和Object的权限,确保数据的安全性和可访问性。基于您提供的信息,这里对OSS的访问权限控制做一个总结,并补充一些可能有帮助的细节:

Bucket权限设置

  • public-read-write: 这个权限允许任何匿名用户对该Bucket进行读、写操作,包括创建、获取和删除Objects。这在需要公开上传或修改资源的场景下有用,但需谨慎使用以避免安全风险。
  • public-read: 匿名用户只能读取Bucket中的Objects,不能进行写操作。这是最常见的公开分享设置,适用于静态网站托管等场景。
  • private: 默认权限,所有访问请求都需要通过签名验证,保证了数据的最大安全性。

设置Bucket权限示例代码

var OSS = require('ali-oss');
var client = new OSS({
  region: '<YourRegion>',
  accessKeyId: '<YourAccessKeyId>',
  accessKeySecret: '<YourAccessKeySecret>',
  bucket: '<YourBucketName>'
});

co(function* () {
  // 获取Bucket ACL
  var result = yield client.getBucketACL('<YourBucketName>');
  console.log(result);

  // 设置Bucket ACL为public-read
  var putResult = yield client.putBucketACL('<YourBucketName>', 'public-read');
  console.log(putResult);
}).catch(function (err) {
  console.log(err);
});

Object权限设置

  • default: 继承Bucket的权限设置。
  • public-read-write: 允许匿名用户读写该Object。
  • public-read: 允许匿名用户读取该Object。
  • private: 所有访问均需经过签名验证。

设置Object权限示例代码

// ... (初始化client部分同上)

co(function* () {
  // 获取Object ACL
  var aclResult = yield client.getACL('<YourObjectName>');
  console.log(aclResult.acl); // default

  // 设置Object ACL为public-read
  yield client.putACL('<YourObjectName>', 'public-read');

  // 再次获取以确认更改
  var updatedAcl = yield client.getACL('<YourObjectName>');
  console.log(updatedAcl.acl); // public-read
}).catch(function (err) {
  console.log(err);
});

注意事项

  • 当直接为Object设置了访问权限(非default),该Object的权限将覆盖Bucket的权限设置。
  • 公开权限(public-read或public-read-write)下的Objects可以直接通过URL访问,格式如:http://bucket-name.oss-region.aliyuncs.com/object-key,其中region需要替换为实际的区域标识。

参考资料

更多关于OSS的访问控制策略、最佳实践以及如何通过控制台或API进行管理,请参考阿里云官方文档中的“访问控制”章节。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答