本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。
注意
设置对象的读写权限前,您必须具有 tos:PutObjectACL
权限,或具备 WRITE_ACP 对象 ACL 权限,具体操作,请参见权限配置指南。
对象 ACL 权限包含以下类型。
访问权限 | 描述 | 访问权限值 |
---|---|---|
READ | 允许被授权者读取对象数据及其元数据 | enum.PermissionRead |
READ_ACP | 允许被授权者读取对象 ACL | enum.PermissionReadAcp |
WRITE_ACP | 允许被授权者为适用的对象编写 ACL | enum.PermissionWriteAcp |
FULL_CONTROL | 允许被授权者在对象上的 READ、READ_ACP 和 WRITE_ACP 权限 | enum.PermissionFullControl |
您可以通过请求体中填写详细的 ACL 权限信息或请求头中设置。
package main import ( "context" "fmt" "github.com/volcengine/ve-tos-golang-sdk/v2/tos" "github.com/volcengine/ve-tos-golang-sdk/v2/tos/enum" ) func checkErr(err error) { if err != nil { if serverErr, ok := err.(*tos.TosServerError); ok { fmt.Println("Error:", serverErr.Error()) fmt.Println("Request ID:", serverErr.RequestID) fmt.Println("Response Status Code:", serverErr.StatusCode) fmt.Println("Response Header:", serverErr.Header) fmt.Println("Response Err Code:", serverErr.Code) fmt.Println("Response Err Msg:", serverErr.Message) } else if clientErr, ok := err.(*tos.TosClientError); ok { fmt.Println("Error:", clientErr.Error()) fmt.Println("Client Cause Err:", clientErr.Cause.Error()) } else { fmt.Println("Error:", err) } panic(err) } } func main() { var ( accessKey = os.Getenv("TOS_ACCESS_KEY") secretKey = os.Getenv("TOS_SECRET_KEY") // Bucket 对应的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com endpoint = "https://tos-cn-beijing.volces.com" region = "cn-beijing" // 填写 BucketName bucketName = "*** Provide your bucket name ***" // 指定的 ObjectKey objectKey = "*** Provide your object key ***" ctx = context.Background() ) // 初始化客户端 client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey))) checkErr(err) // 设置对象 ACL input := &tos.PutObjectACLInput{ Bucket: bucketName, Key: objectKey, // 如果桶开启的多版本,通过设置 VersionID 来设置指定版本 VersionID: "", Owner: tos.Owner{ // 获取 Bucket Owner ID ID: "ownerid", }, Grants: []tos.GrantV2{ { GranteeV2: tos.GranteeV2{ ID: "userId", Type: enum.GranteeUser, }, Permission: enum.PermissionRead, }, }, } output, err := client.PutObjectACL(ctx, input) checkErr(err) fmt.Println("PutObjectACL Request ID:", output.RequestID) }
通过 x-tos-acl 请求头设置对象的读写权限有以下 7 类:
访问权限 | 描述 | 访问权限值 |
---|---|---|
private | 私有。对象的所有者拥有所有权限,其他用户没有权限操作该对象。 | enum.ACLPrivate |
public-read | 公共读。对象的所有者拥有所有权限,其他用户只有该对象的读权限。 | enum.ACLPublicRead |
public-read-write | 公共读写。所有用户都有该对象的读权限。 | enum.ACLPublicReadWrite |
authenticated-read | 对象的所有者拥有所有权限,认证用户拥有该对象的读权限。 | enum.ACLAuthRead |
bucket-owner-read | 对象所有者拥有所有权限,桶所有者拥有此对象的读权限。 | enum.ACLBucketOwnerRead |
bucket-owner-full-control | 桶所有者和对象所有者都拥有对象的所有操作权限。 | enum.ACLBucketOwnerFullControl |
bucket-owner-entrusted | 桶所有者具有此对象的所有控制权,同时可以通过桶策略授权允许或禁止其他账号或用户访问此对象。 | enum.ACLBucketOwnerEntrusted |
以下代码通过 x-tos-acl 设置对象的读写权限:
package main import ( "context" "fmt" "github.com/volcengine/ve-tos-golang-sdk/v2/tos" "github.com/volcengine/ve-tos-golang-sdk/v2/tos/enum" ) func checkErr(err error) { if err != nil { if serverErr, ok := err.(*tos.TosServerError); ok { fmt.Println("Error:", serverErr.Error()) fmt.Println("Request ID:", serverErr.RequestID) fmt.Println("Response Status Code:", serverErr.StatusCode) fmt.Println("Response Header:", serverErr.Header) fmt.Println("Response Err Code:", serverErr.Code) fmt.Println("Response Err Msg:", serverErr.Message) } else if clientErr, ok := err.(*tos.TosClientError); ok { fmt.Println("Error:", clientErr.Error()) fmt.Println("Client Cause Err:", clientErr.Cause.Error()) } else { fmt.Println("Error:", err) } panic(err) } } func main() { var ( accessKey = os.Getenv("TOS_ACCESS_KEY") secretKey = os.Getenv("TOS_SECRET_KEY") // Bucket 对应的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com endpoint = "https://tos-cn-beijing.volces.com" region = "cn-beijing" // 填写 BucketName bucketName = "*** Provide your bucket name ***" // 指定的 ObjectKey objectKey = "*** Provide your object key ***" ctx = context.Background() ) // 初始化客户端 client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey))) checkErr(err) // 设置对象 ACL input := &tos.PutObjectACLInput{ Bucket: bucketName, Key: objectKey, // 如果桶开启的多版本,通过设置 VersionID 来设置指定版本 VersionID: "", ACL: enum.ACLPrivate, } output, err := client.PutObjectACL(ctx, input) checkErr(err) fmt.Println("PutObjectACL Request ID:", output.RequestID) }
关于设置对象的读写权限 API 文档,请参见 PutObjectAcl。
注意
获取对象的访问权限前,您必须具有 tos:GetObjectACL
权限,或具备 READ_ACP 的对象 ACL 权限,具体操作,请参见权限配置指南。
以下代码用于获取对象的访问权限。
package main import ( "context" "fmt" "github.com/volcengine/ve-tos-golang-sdk/v2/tos" ) func checkErr(err error) { if err != nil { if serverErr, ok := err.(*tos.TosServerError); ok { fmt.Println("Error:", serverErr.Error()) fmt.Println("Request ID:", serverErr.RequestID) fmt.Println("Response Status Code:", serverErr.StatusCode) fmt.Println("Response Header:", serverErr.Header) fmt.Println("Response Err Code:", serverErr.Code) fmt.Println("Response Err Msg:", serverErr.Message) } else if clientErr, ok := err.(*tos.TosClientError); ok { fmt.Println("Error:", clientErr.Error()) fmt.Println("Client Cause Err:", clientErr.Cause.Error()) } else { fmt.Println("Error:", err) } panic(err) } } func main() { var ( accessKey = os.Getenv("TOS_ACCESS_KEY") secretKey = os.Getenv("TOS_SECRET_KEY") // Bucket 对应的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com endpoint = "https://tos-cn-beijing.volces.com" region = "cn-beijing" // 填写 BucketName bucketName = "*** Provide your bucket name ***" // 指定的 ObjectKey objectKey = "*** Provide your object key ***" ctx = context.Background() ) // 初始化客户端 client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey))) checkErr(err) // 获取对象 ACL getAclOutput, err := client.GetObjectACL(ctx, &tos.GetObjectACLInput{Bucket: bucketName, Key: objectKey}) checkErr(err) fmt.Println("GetObjectACL Request ID:", getAclOutput.RequestID) // 获取 Bucket Owner 信息 fmt.Println("GetObjectACL Owner:", getAclOutput.Owner) for _, grant := range getAclOutput.Grants { // 授予者所拥有的 Bucket 权限 fmt.Println("Grant Permission:", grant.Permission) // 当 Type 为 CanonicalUser 时,表示权限授予者的 ID fmt.Println("Grant GranteeV2 ID", grant.GranteeV2.ID) // 权限被授予者的名称 fmt.Println("Grant GranteeV2 DisplayName", grant.GranteeV2.DisplayName) // 被授权的用户组 fmt.Println("Grant GranteeV2 Canned", grant.GranteeV2.Canned) // 权限授予者的类型 fmt.Println("Grant GranteeV2 Type", grant.GranteeV2.Type) } }
关于获取对象的读写权限 API 文档,请参见 GetObjectAcl。