更新时间:2024-04-29 GMT+08:00

管理桶访问权限

开发过程中,您有任何问题可以在github上提交issue

桶访问权限(ACL)可以通过三种方式设置:

  1. 创建桶时指定预定义访问策略。
  2. 调用set_bucket_acl_by_head指定预定义访问策略。
  3. 调用set_bucket_acl直接设置。

OBS支持的桶或对象权限包含五类,见下表:

权限

描述

OBS C SDK对应值

读权限

如果有桶的读权限,则可以获取该桶内对象列表和桶的元数据。

如果有对象的读权限,则可以获取该对象内容和元数据。

obs_permission. OBS_PERMISSION_READ

写权限

如果有桶的写权限,则可以上传、覆盖和删除该桶内任何对象。

此权限在对象上不适用。

obs_permission. OBS_PERMISSION_WRITE

读ACP权限

如果有读ACP的权限,则可以获取对应的桶或对象的权限控制列表(ACL)。

桶或对象的所有者永远拥有读对应桶或对象ACP的权限。

obs_permission. OBS_PERMISSION_READ_ACP

写ACP权限

如果有写ACP的权限,则可以更新对应桶或对象的权限控制列表(ACL)。

桶或对象的所有者永远拥有写对应桶或对象的ACP的权限。

拥有了写ACP的权限,由于可以更改权限控制策略,实际上意味着拥有了完全访问的权限。

obs_permission. OBS_PERMISSION_WRITE_ACP

完全控制权限

如果有桶的完全控制权限意味着拥有READ、WRITE、READ_ACP和WRITE_ACP的权限。

如果有对象的完全控制权限意味着拥有READ、READ_ACP和WRITE_ACP的权限。

obs_permission. OBS_PERMISSION_FULL_CONTROL

OBS预定义的访问策略包含五类,见下表:

表1 预定义访问策略

权限

描述

OBS C SDK对应值

私有读写

桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限。

obs_canned_acl. OBS_CANNED_ACL_PRIVATE

公共读私有写

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。

设在对象上,所有人可以获取该对象内容和元数据。

obs_canned_acl. OBS_CANNED_ACL_PUBLIC_READ

公共读写

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、上传对象删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务。

设在对象上,所有人可以获取该对象内容和元数据。

obs_canned_acl. OBS_CANNED_ACL_PUBLIC_READ_WRITE

桶公共读,桶内对象公共读

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据,可以获取该桶内对象的内容和元数据。

不能应用于对象。

obs_canned_acl. OBS_CANNED_ACL_PUBLIC_READ_DELIVERED

桶公共读写,桶内对象公共读写

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务,可以获取该桶内对象的内容和元数据。

不能应用于对象。

obs_canned_acl. OBS_CANNED_ACL_PUBLIC_READ_WRITE_DELIVERED

创桶时指定预定义访问策略

以下代码展示如何在创建桶时指定预定义访问策略:

static void test_create_bucket(obs_canned_acl canned_acl, char *bucket_name)
{
    // 创建并初始化option 
    obs_options option;
    obs_status ret_status = OBS_STATUS_BUTT;
    init_obs_options(&option);

    option.bucket_options.host_name = "<your-endpoint>";
    option.bucket_options.bucket_name = "<Your bucketname>";

    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    option.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    option.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    // 设置响应回调函数
    obs_response_handler response_handler =
    { 
        0, &response_complete_callback
    };
    // 创建桶 canned_acl指定预定义访问策略
    create_bucket(&option, canned_acl, NULL, &response_handler, &ret_status);
    if (ret_status == OBS_STATUS_OK) {
        printf("create bucket successfully. \n");
    }
    else
    {
        printf("create bucket failed(%s).\n", obs_get_status_name(ret_status));
    }
}

为桶设置预定义访问策略

以下代码展示如何为桶设置预定义访问策略参数描述如下表:

字段名

类型

约束

说明

option

请求桶的上下文,配置option

必选

桶参数。

canned_acl

obs_canned_acl

必选

请参考5.5-管理桶访问权限表1 预定义访问策略

handler

obs_response_handler *

必选

回调函数。

callback_data

void *

可选

回调数据。

示例代码如下:

void test_set_bucket_acl_byhead(char *bucket_name)
{
    obs_status ret_status = OBS_STATUS_BUTT;
    // 创建并初始化option
    obs_options option;
    init_obs_options(&option);

    option.bucket_options.host_name = "<your-endpoint>";
    option.bucket_options.bucket_name = "<Your bucketname>";

    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    option.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    option.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    // 设置响应回调函数
    obs_response_handler response_handler =                         
    { 
        0, &response_complete_callback
    };
    // 设置桶预定义访问策略
    obs_canned_acl canned_acl = OBS_CANNED_ACL_PUBLIC_READ_WRITE;
    set_bucket_acl_by_head(&option, canned_acl, &response_handler, &ret_status);
    if (ret_status == OBS_STATUS_OK) {
        printf("set bucket acl by head successfully. \n");
    }
    else
    {
        printf("set bucket acl by head failed(%s).\n", obs_get_status_name(ret_status));
    }
}

直接设置桶访问权限

以下代码展示如何直接设置桶访问权限参数描述如下表:

字段名

类型

约束

说明

option

请求桶的上下文,配置option

必选

桶参数。

aclinfo

manager_acl_info *

必选

管理ACL权限信息相关结构体。

aclinfo->object_info

obs_object_info *

忽略

对象名和版本号,非多版本对象,version设置为0。

aclinfo->owner_id

char *

忽略

用户的DomainId。

aclinfo->acl_grant_count_return

int *

必选

指向返回aclinfo->acl_grants的个数的指针

aclinfo->acl_grants

obs_acl_grant *

必选

权限信息结构体指针,请查看下表,表2 权限信息结构体obs_acl_grant描述

aclinfo->object_delivered

obs_object_delivered

可选

对象ACL是否继承桶的ACL,有效值OBJECT_DELIVERED_TRUE和OBJECT_DELIVERED_FALSE。默认OBJECT_DELIVERED_TRUE。

handler

obs_response_handler *

必选

回调函数。

callback_data

void *

可选

回调数据。

表2 权限信息结构体obs_acl_grant描述

字段名

类型

说明

grantee_type

obs_grantee_type

参看下表,表3 授权者类型描述

grantee.canonical_user.id

char

CanonicalUser ID。

permission

obs_permission

参看5.5管理桶访问权限。

bucket_delivered

obs_bucket_delivered

桶的ACL是否向桶内对象传递,有效值BUCKET_DELIVERED_TRUE和BUCKET_DELIVERED_FALSE。默认BUCKET_DELIVERED_FALSE。

表3 授权者类型描述

字段名

说明

obs_grantee_type.OBS_GRANTEE_TYPE_CANONICAL_USER

OBS用户,桶或对象的权限可以授予任何拥有OBS 账户的用户,被授权后对应的

OBS 用户可以使用AK和SK访问OBS。

obs_grantee_type.OBS_GRANTEE_TYPE_ALL_USERS

所有人,所有人都可以访问对应的桶或对象,包括匿名用户。

示例代码如下:

void test_set_bucket_acl(char *bucket_name)
{
    obs_status ret_status = OBS_STATUS_BUTT;
    // 创建并初始化option
    obs_options option;
    init_obs_options(&option);

    option.bucket_options.host_name = "<your-endpoint>";
    option.bucket_options.bucket_name = "<Your bucketname>";

    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    option.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    option.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    // 设置响应回调函数
    obs_response_handler response_handler =
    { 
        0, &response_complete_callback
    };
    // 创建并初始化acl信息
    manager_acl_info aclinfo;
    init_acl_info(&aclinfo);
    // 设置桶的访问权限
    set_bucket_acl(&option, &aclinfo, &response_handler, &ret_status);
    if (OBS_STATUS_OK == ret_status) {
        printf("set bucket acl successfully. \n");
    }
    else
    {
        printf("set bucket acl failed(%s).\n", obs_get_status_name(ret_status));
    }
    // 释放内存
    deinitialize_acl_info(&aclinfo);
}

ACL中需要填写的所有者(Owner)或者被授权用户(Grantee)的ID,是指用户的账号ID,可通过OBS控制台“我的凭证”页面查看。

获取桶访问权限

您可以通过get_bucket_acl获取桶的访问权限。以下代码展示如何获取桶访问权限:

void test_get_bucket_acl(char *bucket_name)
{
    obs_status ret_status = OBS_STATUS_BUTT;
    // 创建并初始化option
    obs_options option;
    init_obs_options(&option);
    option.bucket_options.host_name = "<your-endpoint>";
    option.bucket_options.bucket_name = "<Your bucketname>";

    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    option.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    option.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    // 设置响应回调函数
    obs_response_handler response_handler =
    { 
        0,&response_complete_callback
    };
    // 申请acl结构内存
    manager_acl_info *aclinfo = malloc_acl_info();
    // 调用获取权限接口
    get_bucket_acl(&option, aclinfo, &response_handler, &ret_status);
    if (OBS_STATUS_OK == ret_status) 
    {
        printf("get bucket acl: -------------");
        printf("%s\n", aclinfo->owner_id);
        if (aclinfo->acl_grant_count_return)
        {
            print_grant_info(*aclinfo->acl_grant_count_return, aclinfo->acl_grants);
        }
    }
    else
    {
        printf("get bucket acl failed(%s).\n", obs_get_status_name(ret_status));
    }
    // 释放内存
    free_acl_info(&aclinfo);
}