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的权限:
C++
1GetBucketAclRequest getBucketAclRequest("bucketName");
2GetBucketAclResponse getBucketAclResponse;
3int ret = client.get_bucket_acl(getBucketAclRequest, &getBucketAclResponse);
4if (ret) {
5 LOGF(WARN, "client err: %d", ret);
6}
7if (getBucketAclResponse.is_fail()) {
8 LOGF(WARN,"get_bucket_acl: [status_code = %d], [message = %s], [requestid = %s]",
9 getBucketAclResponse.status_code(),
10 getBucketAclResponse.error().message().c_str(),
11 getBucketAclResponse.error().request_id().c_str());
12}
13
14//获取ownerid
15std::string owner_id = getBucketAclResponse.owner().id;
16
17//获取acl结构数据
18std::vector<Grant> aclData = getBucketAclResponse.access_control_list();
19std::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.
C++
1PutBucketAclRequest putBucketAclRequest(bucketName);
2PutBucketAclResponse putBucketAclResponse;
3putBucketAclRequest.set_canned_acl("private");
4
5int ret = client.put_bucket_acl(putBucketAclRequest, &putBucketAclResponse);
6if (ret) {
7 LOGF(WARN, "client err: %d", ret);
8}
9if (putBucketAclResponse.is_fail()) {
10 LOGF(WARN,"put_bucket_acl: [status_code = %d], [message = %s], [requestid = %s]",
11 putBucketAclResponse.status_code(),
12 putBucketAclResponse.error().message().c_str(),
13 putBucketAclResponse.error().request_id().c_str());
14}
CannedACL包含三个值: private
、 public-read
、 public-read-write
,它们分别对应相关权限。
具体内容可以参考BOS API文档 使用CannedAcl方式的权限控制。
设置自定义ACL
用户可参考如下代码设置Bucket的自定义访问权限,支持三种不同参数:
Plain Text
1PutBucketAclRequest putBucketAclRequest(bucketName);
2PutBucketAclResponse putBucketAclResponse;
3
4// 1. 通过上传acl json串
5std::string jsonAcl =
6 "{\"accessControlList\":[{\"grantee\":[{\"id\":\"*\"}],\"permission\":[\"READ\"]},{"
7 "\"grantee\":[{\"id\":\"cb5f8xxxxxxxxxx82bbc\"}],\"permission\":["
8 "\"FULL_CONTROL\"]}]}";
9std::string cannedAcl="public-read";
10putBucketAclRequest.set_json_acl(jsonAcl);
11
12
13// 2. 上传acl文件
14std::string aclFilePath = "/tmp/acl.json"
15int setRet = putBucketAclRequest.set_acl_file(aclFilePath);
16if (ret) {
17 LOGF(WARN, "client set_acl_file: %d", ret);
18}
19
20// 3. 通过设置access_control_list数据
21std::vector<Grant> grants;
22Grant grant;
23grantee.id = "77fxxxxxxxxxxx5fa406";
24grant.grantee.push_back(grantee);
25grant.permission.push_back("READ");
26grants.push_back(grant);
27putBucketAclRequest.set_access_control_list(grants);
28
29int ret = client.put_bucket_acl(putObjectAclRequest, &putBucketAclRequest);
30if (ret) {
31 LOGF(WARN, "client err: %d", ret);
32}
33if (putBucketAclRequest.is_fail()) {
34 LOGF(WARN,"put_bucket_acl: [status_code = %d], [message = %s], [requestid = %s]",
35 putBucketAclRequest.status_code(),
36 putBucketAclRequest.error().message().c_str(),
37 putBucketAclRequest.error().request_id().c_str());
38}