本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。
对象 ACL 权限包含以下类型。
访问权限 | 描述 | 对应枚举值 |
---|---|---|
READ | 允许被授权者读取对象数据及其元数据。 | PermissionType::Read |
READ_ACP | 允许被授权者读取对象 ACL。 | PermissionType::ReadAcp |
WRITE_ACP | 允许被授权者为适用的对象编写 ACL。 | PermissionType::WriteAcp |
FULL_CONTROL | 允许被授权者在对象上的 READ、READ_ACP 和 WRITE_ACP 权限。 | PermissionType::FullControl |
注意
设置对象的读写权限,您必须具备 tos:PutObjectACL
权限,或具备 WRITE_ACP
对象 ACL 权限,具体操作,请参见权限配置指南。
您可通过请求体中填写详细的 ACL 权限信息,或请求头中设置。
通过 x-tos-acl
请求头设置对象的读写权限有以下六类。
访问权限 | 描述 | 对应枚举值 |
---|---|---|
私有 | 私有。对象的所有者拥有所有权限,其他用户没有权限操作该对象。 | ACLType::Private |
公共读 | 公共读。任何人拥有对象的 READ 权限。 | ACLType::PublicRead |
公共读写 | 公共读写。任何人拥有对象的 READ 权限。 | ACLType::PublicReadWrite |
认证用户读 | 任何已认证用户拥有对象的 READ 权限。 | ACLType::AuthenticatedRead |
桶所有者读 | 桶和对象的所有者,拥有对象的 READ 权限。 | ACLType::BucketOwnerRead |
桶所有者具备所有权限 | 桶和对象的所有者,拥有对象的完全控制权限。 | ACLType::BucketOwnerFullControl |
以下代码通过 x-tos-acl
设置对象的读写权限。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); PutObjectAclV2Input input(bucketName,objectName); // 如果需要设置对象元数据,可按如下设置 input.setAcl(ACLType::PublicRead); auto output = client.putObjectAcl(input); if (!output.isSuccess()) { // 异常处理 std::cout << "PutObjectAcl failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "PutObjectAcl success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
以下代码通过 x-tos-grant-*
请求头设置桶 examplebucket
中对象 exampledir/exampleobject.txt
的读写权限。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 设置桶的访问权限为公共读,默认为私有。 PutObjectAclV2Input input(bucketName,objectName); // 设置用户ID为1000000001具备FULL_CONTROL控制权, 所有用户具备桶的READ权限 input.setGrantFullControl("id=\"1000000001\""); input.setGrantRead("canned=\"AllUsers\""); auto output = client.putObjectAcl(input); if (!output.isSuccess()) { // 异常处理 std::cout << "SetObjectACL failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "SetObjectACL success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 设置桶的访问权限为公共读,默认为私有。 PutObjectAclV2Input input(bucketName,objectName); // 设置对象 ACL // 如果桶开启的多版本,通过设置 VersionID 来设置指定版本 Owner owner; owner.setId("test-cid"); GranteeV2 granteev2; granteev2.setType(GranteeType::Group); granteev2.setCanned(CannedType::AllUsers); GrantV2 grantv2; grantv2.setGrantee(granteev2); grantv2.setPermission(PermissionType::WriteAcp); input.setOwner(owner); input.setGrants({grantv2}); auto output = client.putObjectAcl(input); if (!output.isSuccess()) { // 异常处理 std::cout << "SetObjectACL failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "SetObjectACL success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 需要上传的对象数据,以 stringstream 的形式上传 std::string data("Object data to be uploaded"); auto ss = std::make_shared<std::stringstream>(data); PutObjectV2Input input(bucketName, objectName, ss); // 如果需要设置对象元数据,可按如下设置 // 设置 ACL 为 PublicRead input.setAcl(ACLType::PublicRead); auto output = client.putObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "PutObjectWithMetaData failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "PutObjectWithMetaData success. the object etag:" << output.result().getETag() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
#include "TosClientV2.h" using namespace VolcengineTos; static int64_t getFileSize(const std::string& file) { std::fstream f(file, std::ios::in | std::ios::binary); f.seekg(0, f.end); int64_t size = f.tellg(); f.close(); return size; } int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 初始化分片上传事件 CreateMultipartUploadInput input(bucketName, objectName); // 可以指定 ACL,StorageClass,用户自定义元数据等 input.setAcl(ACLType::PublicRead); auto upload = client.createMultipartUpload(input); if (!upload.isSuccess()) { // 异常处理 std::cout << "createMultipartUpload failed." << upload.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "createMultipartUpload success." << std::endl; // 准备上传的文件 std::string fileToUpload = "yourLocalFilename"; // 5MB int64_t partSize = 5 * 1024 * 1024; std::vector<UploadedPartV2> partResList; auto fileSize = getFileSize(fileToUpload); int partCount = static_cast<int>(fileSize / partSize); // 计算分片个数 if (fileSize % partSize != 0) { partCount++; } // 对每一个分片进行上传 auto uploadId = upload.result().getUploadId(); for (int i = 1; i <= partCount; i++) { auto offset = partSize * (i - 1); auto size = (partSize < fileSize - offset) ? partSize : (fileSize - offset); std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(fileToUpload, std::ios::in|std::ios::binary); content->seekg(offset, std::ios::beg); UploadPartV2Input uploadPartInput(bucketName, objectName,uploadId, size,i,content); auto uploadPartOutput = client.uploadPart(uploadPartInput); if (uploadPartOutput.isSuccess()) { std::cout << "uploadPart failed." << upload.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } UploadedPartV2 part(i, uploadPartOutput.result().getETag()); partResList.push_back(part); } // 完成分片上传 CompleteMultipartUploadV2Input completeMultipartUploadInput(bucketName, objectName, uploadId, partResList); auto com = client.completeMultipartUpload(completeMultipartUploadInput); if (!com.isSuccess()) { // 异常处理 std::cout << "CompleteMultipartUpload failed." << upload.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "CompleteMultipartUpload success." << com.result().getRequestInfo().getRequestId() << std::endl; CloseClient(); return 0; }
关于设置对象的读写权限 API 文档,请参见 PutObjectAcl。
注意
获取对象的访问权限,您必须具备 tos:GetObjectACL
权限,或具备 READ_ACP
的对象 ACL 权限,具体操作,请参见权限配置指南。
以下代码用于获取桶 examplebucket
中对象 exampledir/exampleobject.txt
的读写权限。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); GetObjectAclV2Input input(bucketName,objectName); auto output = client.getObjectAcl(input); if (!output.isSuccess()) { // 异常处理 std::cout << "GetOBjectAcl failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "GetObjectAcl success." << std::endl; // 打印 ACL 信息 auto grant = output.result().getGrant(); for(auto& g : grant) { std::cout << " the premission is:" << g.getStringFormatPermission() << " the grantee id is:" << g.getGrantee().getId() << " the display name is:" << g.getGrantee().getDisplayName() << " the grantee is:" << g.getGrantee().getStringFormatType() << " the canned is:" << g.getGrantee().getStringFormatCanned() << std::endl; } // 释放网络等资源 CloseClient(); return 0; }
关于获取对象的读写权限 API 文档,请参见 GetObjectAcl。