You need to enable JavaScript to run this app.
导航

管理对象读写权限(C++ SDK)

最近更新时间2024.02.04 18:30:56

首次发布时间2022.04.08 10:56:30

本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。

对象 ACL 说明

对象 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;
}

请求体中填写详细 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);
    // 设置对象 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 权限,具体操作,请参见权限配置指南

通过 getObjectACL 接口查询对象读写权限

以下代码用于获取桶 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