设置桶ACL(Python SDK)
功能说明
OBS支持对桶操作进行权限控制,您可以为桶设置访问策略,指定某一个用户对某一个桶是否有权行使某一项指定操作。OBS权限控制的方式有IAM、桶策略和ACL三种,ACL按照粒度又分为桶ACL和对象ACL,本节将对桶ACL接口进行详细介绍,更多权限相关内容可参见《对象存储服务权限配置指南》的OBS权限控制概述章节。
桶ACL是跨账号场景的权限,设置授权的对象不是当前账号,也不是当前账号下的IAM用户,而是另一个华为云账号及其账号下的IAM用户;授权的范围是以桶为粒度的,一条ACL策略为一个桶设置策略,因此设置ACL策略时您必须明确指定桶名;桶ACL授予的权限包括桶的访问权限和桶ACL的访问权限两个方面,桶的访问权限包括对桶及桶内对象的查看和编辑权限,桶ACL的访问权限包括对桶ACL策略的查看和编辑权限,详情可参见ACL权限控制方式介绍。
调用设置桶ACL接口,您可以修改指定桶的ACL策略。
接口约束
- 单个桶最多支持100条ACL策略。
- 您必须是桶拥有者或拥有设置桶ACL的权限,才能设置桶ACL。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:PutBucketAcl权限,如果使用桶策略则需授予PutBucketAcl权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。
- OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。
方法定义
ObsClient.setBucketAcl(bucketName, acl, aclControl, extensionHeaders)
请求参数说明
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
bucketName |
str |
必选 |
参数解释: 桶名。 约束限制:
默认取值: 无 |
acl |
可选 |
参数解释: 桶的访问权限。 取值范围: acl取值详见权限ACL。 默认取值: 无
说明:
acl与aclControl互斥。 |
|
aclControl |
str |
可选 |
参数解释: 预定义访问策略。 取值范围: 您可以选择预定义访问策略中任一个访问策略。 默认取值: 无
说明:
acl与aclControl互斥。 |
extensionHeaders |
dict |
可选 |
参数解释: 接口的拓展头域。 取值范围: 参考自定义头域。 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
owner |
作为请求参数时必选 |
参数解释: 桶的所有者信息,详见Owner。 约束限制: Owner和Grants必须配套使用,且与aclControl互斥。 默认取值: 无 |
|
grants |
list of Grant |
作为请求参数时必选 |
参数解释: 被授权用户权限信息列表。详见Grant 默认取值: 无 |
delivered |
bool |
作为请求参数时可选 |
参数解释: 桶的ACL是否向桶内对象传递。作用于桶内所有对象。 取值范围: True:是,桶ACL向桶内对象传递。 False:否,桶ACL不向桶内对象传递,仅作用于桶。 默认取值: False |
常量值 |
说明 |
---|---|
READ |
读权限。 如果有桶的读权限,则可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。 如果有对象的读权限,则可以获取该对象内容和元数据。 |
WRITE |
写权限。 如果有桶的写权限,则可以上传、覆盖和删除该桶内任何对象和段。 此权限在对象上不适用。 |
READ_ACP |
读取ACL配置的权限。 如果有读ACP的权限,则可以获取对应的桶或对象的权限控制列表(ACL)。 桶或对象的所有者永远拥有读对应桶或对象ACP的权限。 |
WRITE_ACP |
修改ACL配置的权限。 如果有写ACP的权限,则可以更新对应桶或对象的权限控制列表(ACL)。 桶或对象的所有者永远拥有写对应桶或对象的ACP的权限。 拥有了写ACP的权限,由于可以更改权限控制策略,实际上意味着拥有了完全访问的权限。 |
FULL_CONTROL |
完全控制权限,包括对桶或对象的读写权限,以及对桶或对象ACL配置的读写权限。 如果有桶的完全控制权限意味着拥有READ、WRITE、READ_ACP和WRITE_ACP的权限。 如果有对象的完全控制权限意味着拥有READ、READ_ACP和WRITE_ACP的权限。 |
常量名 |
原始值 |
说明 |
---|---|---|
HeadPermission.PRIVATE |
private |
私有读写。 桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限。 |
HeadPermission.PUBLIC_READ |
public-read |
公共读私有写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。 设在对象上,所有人可以获取该对象内容和元数据。 |
HeadPermission.PUBLIC_READ_WRITE |
public-read-write |
公共读写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务。 设在对象上,所有人可以获取该对象内容和元数据。 |
HeadPermission.PUBLIC_READ_DELIVERED |
public-read-delivered |
桶公共读,桶内对象公共读。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本,可以获取该桶内对象的内容和元数据。
说明:
PUBLIC_READ_DELIVERED不能应用于对象。 |
HeadPermission.PUBLIC_READ_WRITE_DELIVERED |
public-read-write-delivered |
桶公共读写,桶内对象公共读写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务,可以获取该桶内对象的内容和元数据。
说明:
PUBLIC_READ_WRITE_DELIVERED不能应用于对象。 |
HeadPermission.BUCKET_OWNER_FULL_CONTROL |
public-read-write-delivered |
设在对象上,桶和对象的所有者拥有对象的完全控制权限,其他任何人都没有访问权限。默认情况下,上传对象至其他用户的桶中,桶拥有者没有对象的控制权限。对象拥有者为桶拥有者添加此权限控制策略后,桶所有者可以完全控制对象。例如,用户A上传对象x至用户B的桶中,系统默认用户B没有对象x的控制权。当用户A为对象x设置bucket-owner-full-control策略后,用户B就拥有了对象x的控制权。 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
owner_id |
str |
作为请求参数时必选 |
参数解释: 所有者的账号ID,即domain_id。 取值范围: 如何获取账号ID请参见如何获取账号ID和用户ID? 默认取值: 无 |
owner_name |
str |
作为请求参数时可选 |
参数解释: 所有者的账号用户名。 取值范围: 如何获取账号用户名请参见如何获取用户名? 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
grantee |
作为请求参数时必选 |
参数解释: 被授权用户相关信息,详见Grantee。 |
|
permission |
str |
作为请求参数时必选 |
参数解释: 被授予的权限。 取值范围: 取值范围详见权限,您可以选择权限中的一个或多个权限对桶进行配置。 默认取值: 无 |
delivered |
bool |
作为请求参数时可选 |
参数解释: 桶的ACL是否向桶内对象传递。作用于桶内所有对象。 取值范围: True:是,桶ACL向桶内对象传递。 False:否,桶ACL不向桶内对象传递,仅作用于桶。 默认取值: False |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
grantee_id |
str |
作为请求参数时,如果group为空则必选。 |
参数解释: 被授权用户的账号ID,即domain_id。 取值范围: 如何获取账号ID请参见获取账号ID。 默认取值: 无 |
grantee_name |
str |
作为请求参数时可选 |
参数解释: 被授权的用户名。如何获取账号用户名请参见如何获取用户名? 约束限制:
默认取值: 无 |
group |
str |
作为请求参数时,如果grantee_id为空则必选。 |
参数解释: 被授权的用户组。 取值范围: 授权用户组取值范围详见用户组。 默认取值: 无 |
grantee_id与grantee_name配套使用,且与group互斥,即被授权用户可以是一个具体用户(通过grantee_id标识)或者是一个用户组。
返回结果说明
类型 |
说明 |
---|---|
参数解释: SDK公共结果对象。 |
参数名称 |
参数类型 |
描述 |
---|---|---|
status |
int |
参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 |
reason |
str |
参数解释: HTTP文本描述。 默认取值: 无 |
errorCode |
str |
参数解释: OBS服务端错误码,当status参数小于300时为空。 默认取值: 无 |
errorMessage |
str |
参数解释: OBS服务端错误描述,当status参数小于300时为空。 默认取值: 无 |
requestId |
str |
参数解释: OBS服务端返回的请求ID。 默认取值: 无 |
indicator |
str |
参数解释: OBS服务端返回的错误定位码。 默认取值: 无 |
hostId |
str |
参数解释: 请求的服务端ID,当status参数小于300时为空。 默认取值: 无 |
resource |
str |
参数解释: 发生错误时相关的桶或对象,当status参数小于300时为空。 默认取值: 无 |
header |
list |
参数解释: 响应消息头列表,由多个元组构成。每个元组均包含两个元素,代表响应头的键值对。 默认取值: 无 |
body |
object |
参数解释: 操作成功后的结果数据,当status大于300时为空。该值根据调用接口的不同而不同,参见“桶相关接口”章节和“对象相关接口”章节的详细描述。 默认取值: 无 |
代码样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
from obs import ObsClient, HeadPermission from obs import ACL from obs import Owner from obs import Grantee from obs import Grant from obs import Group from obs import Permission import os import traceback # 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险 # 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html ak = os.getenv("AccessKeyID") sk = os.getenv("SecretAccessKey") # 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取 # security_token = os.getenv("SecurityToken") # server填写Bucket对应的Endpoint, 这里以中国-香港为例,其他地区请按实际情况填写 server = "https://obs.ap-southeast-1.myhuaweicloud.com" # 创建obsClient实例 # 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值 obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server) try: # ownerid为所有者的账号ID owner_id = 'ownerid' owner = Owner(owner_id=owner_id) # 指定单个用户(userid为IAM用户的ID) grantee1 = Grantee(grantee_id='userid') # 指定所有用户 grantee2 = Grantee(group=Group.ALL_USERS) # 为指定用户(userid)设置读写权限 grant1 = Grant(grantee=grantee1, permission=Permission.READ) grant2 = Grant(grantee=grantee1, permission=Permission.WRITE) # 为所有用户设置公共读权限 grant3 = Grant(grantee=grantee2, permission=Permission.READ) # 权限信息对象,设置名为examplebucket桶的ACL权限控制为:所有用户拥有公共读的权限,指定用户(userid)拥有读写的权限 acl = ACL(owner=owner, grants=[grant1, grant2, grant3]) bucketName = "examplebucket" # 设置桶的访问权限 resp = obsClient.setBucketAcl(bucketName, acl) # 返回码为2xx时,接口调用成功,否则接口调用失败 if resp.status < 300: print('Set Bucket Acl Succeeded') print('requestId:', resp.requestId) else: print('Set Bucket Acl Failed') print('requestId:', resp.requestId) print('errorCode:', resp.errorCode) print('errorMessage:', resp.errorMessage) except: print('Set Bucket Acl Failed') print(traceback.format_exc()) |