Bucket权限管理
更新时间:2022-10-08
Bucket权限管理
目前BOS支持两种方式设置ACL. 具体可参考权限控制
第一种是使用Canned Acl,在put_object_acl的时候,通过头域的"x-bce-acl", "x-bce-grant-read", 或者 "x-bce-grant-permission"来设置对象的访问权限,当前可设置的权限包括private和public-read,三种类型的header不可以同时在一个请求中出现.
第二种方式是以自定义Acl样式, 具体可通过上传其json字符串, 设置access_control_list结构体, 或者直接上传ACL文件. 具体可参考权限控制概述
查看Bucket的权限
如下代码可以查看Bucket的权限:
GetBucketAclRequest getBucketAclRequest("bucketName");
GetBucketAclResponse getBucketAclResponse;
int ret = client.get_bucket_acl(getBucketAclRequest, &getBucketAclResponse);
if (ret) {
LOGF(WARN, "client err: %d", ret);
}
if (getBucketAclResponse.is_fail()) {
LOGF(WARN,"get_bucket_acl: [status_code = %d], [message = %s], [requestid = %s]",
getBucketAclResponse.status_code(),
getBucketAclResponse.error().message().c_str(),
getBucketAclResponse.error().request_id().c_str());
}
//获取ownerid
std::string owner_id = getBucketAclResponse.owner().id;
//获取acl结构数据
std::vector<Grant> aclData = getBucketAclResponse.access_control_list();
std::string jsonStr = getBucketAclResponse.json_access_control_list();
get_bucket_acl
方法返回的response中可供调用的参数有:
参数 | 类型 | 说明 |
---|---|---|
owner | Owner(string) | Bucket owner id |
access_control_list | vector<Grant> | 保存acl的容器 |
Grant所有字段含义, 具体可参考权限控制概述
注意:
- 若您使用STS进行访问控制,C++ SDK仅支持传入STS, 不支持获取。
设置Bucket的访问权限
设置Canned ACL
如下代码将Bucket的权限设置为了private.
PutBucketAclRequest putBucketAclRequest(bucketName);
PutBucketAclResponse putBucketAclResponse;
putBucketAclRequest.set_canned_acl("private");
int ret = client.put_bucket_acl(putBucketAclRequest, &putBucketAclResponse);
if (ret) {
LOGF(WARN, "client err: %d", ret);
}
if (putBucketAclResponse.is_fail()) {
LOGF(WARN,"put_bucket_acl: [status_code = %d], [message = %s], [requestid = %s]",
putBucketAclResponse.status_code(),
putBucketAclResponse.error().message().c_str(),
putBucketAclResponse.error().request_id().c_str());
}
CannedACL包含三个值: private
、 public-read
、 public-read-write
,它们分别对应相关权限。
具体内容可以参考BOS API文档 使用CannedAcl方式的权限控制。
设置自定义ACL
用户可参考如下代码设置Bucket的自定义访问权限,支持三种不同参数:
PutBucketAclRequest putBucketAclRequest(bucketName);
PutBucketAclResponse putBucketAclResponse;
// 1. 通过上传acl json串
std::string jsonAcl =
"{\"accessControlList\":[{\"grantee\":[{\"id\":\"*\"}],\"permission\":[\"READ\"]},{"
"\"grantee\":[{\"id\":\"cb5f8xxxxxxxxxx82bbc\"}],\"permission\":["
"\"FULL_CONTROL\"]}]}";
std::string cannedAcl="public-read";
putBucketAclRequest.set_json_acl(jsonAcl);
// 2. 上传acl文件
std::string aclFilePath = "/tmp/acl.json"
int setRet = putBucketAclRequest.set_acl_file(aclFilePath);
if (ret) {
LOGF(WARN, "client set_acl_file: %d", ret);
}
// 3. 通过设置access_control_list数据
std::vector<Grant> grants;
Grant grant;
grantee.id = "77fxxxxxxxxxxx5fa406";
grant.grantee.push_back(grantee);
grant.permission.push_back("READ");
grants.push_back(grant);
putBucketAclRequest.set_access_control_list(grants);
int ret = client.put_bucket_acl(putObjectAclRequest, &putBucketAclRequest);
if (ret) {
LOGF(WARN, "client err: %d", ret);
}
if (putBucketAclRequest.is_fail()) {
LOGF(WARN,"put_bucket_acl: [status_code = %d], [message = %s], [requestid = %s]",
putBucketAclRequest.status_code(),
putBucketAclRequest.error().message().c_str(),
putBucketAclRequest.error().request_id().c_str());
}