You need to enable JavaScript to run this app.
导航
管理对象的访问权限(Go SDK)
最近更新时间:2024.02.04 18:30:55首次发布时间:2021.12.31 17:38:36

本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。

设置对象的读写权限

注意

设置对象的读写权限前,您必须具有 tos:PutObjectACL 权限,或具备 WRITE_ACP 对象 ACL 权限,具体操作,请参见权限配置指南

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 权限信息或请求头中设置。

请求体中填写详细 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