设置桶访问权限

Bucket是用于存储对象(Object)的容器,所有的对象都必须隶属于某个Bucket。本文介绍如何设置桶(Bucket)访问权限。

  • PutBucketAcl

PutBucketAcl操作可以通过access control list(ACL)设置一个bucket的访问权限。用户在设置bucket的ACL之前需要具备WRITE_ACP 权限。

Bucket的权限说明:

权限类型 说明
READ 可以对bucket进行list操作。
READ_ACP 可以读取bucket的ACL信息。bucket的拥有者默认具有bucket的READ_ACP权限。
WRITE 可以在bucket中创建对象,修改原有对象数据和删除对象。
WRITE_ACP 可以修改bucket的ACL信息,授予该权限相当于授予FULL_CONTROL权限,因为具有WRITE_ACP权限的用户可以配置bucket的任意权限。bucket的拥有者默认具有bucket的WRITE_ACP权限。
FULL_CONTROL 同时授予READ、READ_ACP、WRITE和WRITE_ACP权限。

代码示例:

// 设置加桶ACL
func PutBucketAcl(svc *s3.S3) {
    bucket := "exampleBucket"
    permission := "READ" // FULL_CONTROL、WRITE、WRITE_ACP、READ、READ_ACP
    granteeDisplayName := "yourUserDisplayName"
    granteeId := "yourUserID"
    userType := "CanonicalUser"
    // 获取当前ACL
    currentACL, err := svc.GetBucketAcl(&s3.GetBucketAclInput{Bucket: aws.String(bucket)})
    if err != nil {
        fmt.Printf("fail to get acl of bucket, %v\n", err)
        os.Exit(1)
    }
    // 创建一个新的授权信息
    var newGrantee = s3.Grantee{
        Type:        aws.String(userType),
        DisplayName: aws.String(granteeDisplayName),
        ID:          aws.String(granteeId),
    }
    var newGrant = s3.Grant{Grantee: &newGrantee, Permission: &permission}

    grants := currentACL.Grants
    owner := *currentACL.Owner.DisplayName
    ownerId := *currentACL.Owner.ID
    grants = append(grants, &newGrant)
    // 添加一个授权信息
    putBucketAclInput := &s3.PutBucketAclInput{
        Bucket: &bucket,
        AccessControlPolicy: &s3.AccessControlPolicy{
            Grants: grants,
            Owner: &s3.Owner{
                DisplayName: &owner,
                ID:          &ownerId,
            },
        },
    }

    _, err = svc.PutBucketAcl(putBucketAclInput)
    if err != nil {
        fmt.Printf("fail to put acl to bucket. %v\n", err)
        os.Exit(1)
    }
    fmt.Println("Congratulations. You gave user with ", permission, "permission to bucket", bucket)
}

PutBucketAclInput可设置的参数如下:

参数 类型 说明 是否必要
ACL *string 配置此bucket预定义的标准ACL信息,例如private,public-read等。
AccessControlPolicy *AccessControlPolicy 配置该bucket对于每个用户的ACL授权信息。
Bucket *string bucket的名称。
GrantFullControl *string 用于自定义用户对此bucket的FULL_CONTROL权限信息。
GrantRead *string 用于自定义用户对此bucket的READ权限信息。
GrantReadACP *string 用于自定义用户对此bucket ACL的READ权限信息。
GrantWrite *string 用于自定义用户对此bucket的WRITE权限信息。
GrantWriteACP *string 用于自定义用户对此bucket ACL的WRITE权限信息。

用户可以通过ACL参数设置bucket的访问权限,也可以通过GrantFullControl、GrantRead、GrantReadACP、GrantWrite、GrantWriteACP等参数设置bucket的访问权限,但二者只能同时使用一种方式。

  • PutBucketAclRequest

PutBucketAclRequest操作首先生成一个"request.Request"对象,该对象是一个执行PutBucketAcl操作的请求。通过调用Request对象的Send方法完成设置bucket ACL信息的操作。该方法可以生成定制化的请求,例如自定义请求头部请求超时重试设置。

代码示例:

func PutBucketAclRequest(svc *s3.S3) {
    bucket := "exampleBucket"
    permission := "READ_ACP" // FULL_CONTROL、WRITE、WRITE_ACP、READ、READ_ACP
    granteeDisplayName := "yourUserDisplayName"
    granteeId := "yourUserID"
    userType := "CanonicalUser"
    // 获取当前ACL
    currentACL, err := svc.GetBucketAcl(&s3.GetBucketAclInput{Bucket: aws.String(bucket)})
    if err != nil {
        fmt.Printf("fail to get acl of bucket, %v\n", err)
        os.Exit(1)
    }
    // 创建一个新的授权信息
    var newGrantee = s3.Grantee{
        Type:        aws.String(userType),
        DisplayName: aws.String(granteeDisplayName),
        ID:          aws.String(granteeId),
    }
    var newGrant = s3.Grant{Grantee: &newGrantee, Permission: &permission}

    grants := currentACL.Grants
    owner := *currentACL.Owner.DisplayName
    ownerId := *currentACL.Owner.ID
    grants = append(grants, &newGrant)
    // 添加一个授权信息
    putBucketAclInput := &s3.PutBucketAclInput{
        Bucket: &bucket,
        AccessControlPolicy: &s3.AccessControlPolicy{
            Grants: grants,
            Owner: &s3.Owner{
                DisplayName: &owner,
                ID:          &ownerId,
            },
        },
    }

    req, resp := svc.PutBucketAclRequest(putBucketAclInput)

    err = req.Send()
    if err != nil {
        fmt.Printf("fail to put bucket acl. %v\n", err)
    } else {
        fmt.Println(resp)
    }
}

 响应结果:

HTTP状态 响应码 描述
200 Success 操作成功。
400 InvalidArgument 参数错误。
403 AccessDenied 用户没有权限执行操作。
404 NoSuchBucket 操作指定的bucket不存在。