管理对象访问权限
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。
对象访问权限与桶访问权限类似,也可支持预定义访问策略(参见管理桶访问权限)或直接设置。
对象访问权限(ACL)可以通过三种方式设置:
- 上传对象时指定预定义访问策略。
- 调用set_object_acl_by_head指定预定义访问策略。
- 调用set_object_acl直接设置。
上传对象时指定预定义访问策略
以下代码展示如何在上传对象时指定预定义访问策略:
static void test_put_object_acl() { // 创建并初始化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/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"); // 初始化结构体put_properties,可以通过该结构体设置对象属性 obs_put_properties put_properties; init_put_properties(&put_properties); // 指定预定义访问策略 put_properties.canned_acl = OBS_CANNED_ACL_PUBLIC_READ_WRITE; // 回调数据 put_file_object_callback_data data; memset(&data, 0, sizeof(put_file_object_callback_data)); // 将要上传的文件读到回调数据中 data.infile = 0; data.noStatus = 1; content_length = read_bytes_from_file("<Uploaded filename>", &data); // 回调函数 obs_put_object_handler putobjectHandler = { { &response_properties_callback, &response_complete_callback }, &put_buffer_object_data_callback }; // 上传数据流 put_object(&option,"<object key>", content_length, &put_properties, 0, &putobjectHandler, &data); if (OBS_STATUS_OK == data.ret_status) { printf("put object from file successfully. \n"); } else { printf("put object failed(%s).\n", obs_get_status_name(data.ret_status)); } }
为对象设置预定义访问策略
您可以通过set_object_acl_by_head来设置对象属性,参数描述如下表:
字段名 |
类型 |
约束 |
说明 |
---|---|---|---|
option |
请求桶的上下文,配置option |
必选 |
桶参数。 |
object_info |
obs_object_info * |
必选 |
对象名和版本号,非多版本对象,version设置为0。 |
canned_acl |
obs_canned_acl |
必选 |
|
handler |
obs_response_handler * |
必选 |
回调函数。 |
callback_data |
void * |
可选 |
回调数据。 |
示例代码如下:
void test_set_object_acl_byhead() { 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/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; obs_object_info object_info; object_info.key = "<object key>"; object_info.version_id = "<object version ID>"; // 设置对象预定义访问策略 set_object_acl_by_head(&option, &object_info, 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)); } }
直接设置对象访问权限
您可以通过set_object_acl来设置对象属性,参数描述如下表:
字段名 |
类型 |
约束 |
说明 |
---|---|---|---|
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 * |
必选 |
权限信息结构体指针,请查看5.5-管理桶访问权限,表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 * |
可选 |
回调数据。 |
示例代码如下:
void test_set_object_acl() { 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/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 }; // 定义对象访问权限信息 manager_acl_info aclinfo; init_acl_info(&aclinfo); aclinfo.object_info.key = "<object key>"; aclinfo.object_info.version_id = "<object version ID>"; // 设置对象访问权限 set_object_acl(&option, &aclinfo, &response_handler, &ret_status); if (OBS_STATUS_OK == ret_status) { printf("set object acl successfully. \n"); } else { printf("set object acl failed(%s).\n", obs_get_status_name(ret_status)); } // 销毁内存 deinitialize_acl_info(&aclinfo); }
ACL中需要填写的所有者(Owner)或者被授权用户(Grantee)的ID,是指用户的账号ID,可通过OBS控制台“我的凭证”页面查看。
获取对象访问权限
您可以通过get_object_acl获取对象的访问权限。以下代码展示如何获取对象访问权限:
void test_get_object_acl() { 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/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 }; manager_acl_info *aclinfo = malloc_acl_info(); aclinfo->object_info.key = "<object key>"; aclinfo->object_info.version_id = "<object version ID>"; // 获取对象权限信息 get_object_acl(&option, aclinfo, &response_handler, &ret_status); if (OBS_STATUS_OK == ret_status) { printf("get object acl: -------------"); printf("%s %d %s %s\n", aclinfo->owner_id, aclinfo->object_delivered, aclinfo->object_info.key, aclinfo->object_info.version_id); if (aclinfo->acl_grant_count_return) { print_grant_info(*aclinfo->acl_grant_count_return, aclinfo->acl_grants); } } else { printf("get object acl failed(%s).\n", obs_get_status_name(ret_status)); } // 销毁内存 free_acl_info(&aclinfo); }