设置对象访问权限

PutObjectAcl操作可以为媒体存储服务中的对象设置访问权限,对一个对象执行PutObjectAcl操作需要具有WRITE_ACP权限。执行PutObjectAcl操作的时候,要么使用封装好的ACL数据类型传入ACL信息,要么以字符串的形式详细描述ACL信息。

使用内置标准ACL权限

代码示例:

func putObjectAcl(svc *s3.S3) {
	key := "ExampleObject.txt"
	acl := "private" // private, public-read, public-read-write
	outPutAcl, err := svc.PutObjectAcl(&s3.PutObjectAclInput{
		Bucket: aws.String(p.bucket),
		Key:    aws.String(key),
		ACL:    aws.String(acl),
	})
	if err != nil {
		fmt.Println("err, ", err)
		return
	}
	fmt.Println("putObjectAcl success, ", outPutAcl)
}

权限说明:

权限 SDK对应值
私有读写 private
公共读 public-read
公共读写 public-read-write

直接设置ACL权限

代码示例:

// 添加对象的访问控制项
func PutObjectAcl(svc *s3.S3) {
    bucket := "exampleBucket"
    key := "exampleKey"
    permission := "READ" // FULL_CONTROL、WRITE、WRITE_ACP、READ、READ_ACP
    granteeDisplayName := "yourUserDisplayName"
    granteeId := "yourUserID"
    userType := "CanonicalUser"
    // 获取当前acl
    getObjectAclOutput, err := svc.GetObjectAcl(&s3.GetObjectAclInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    })
    if err != nil {
        fmt.Printf("fail to get acl of object %v, %v\n", key, 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 := getObjectAclOutput.Grants
    owner := *getObjectAclOutput.Owner.DisplayName
    ownerId := *getObjectAclOutput.Owner.ID
    grants = append(grants, &newGrant)
    // 设置对象的ACL
    putObjectAclInput := &s3.PutObjectAclInput{
        AccessControlPolicy: &s3.AccessControlPolicy{
            Grants: grants,
            Owner: &s3.Owner{
                DisplayName: &owner,
                ID:          &ownerId,
            },
        },
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    }

    putObjectAclOutput, err := svc.PutObjectAcl(putObjectAclInput)
    if err != nil {
        fmt.Printf("fail to put objec acl. %v\n", err)
        return
    }
    fmt.Println(putObjectAclOutput)
}

Object的权限说明:

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

PutObjectAclInput可设置的参数如下:

参数 类型 说明 是否必要
ACL *string 配置对象预定义的标准ACL信息,例如private,public-read,public-read-write等。
AccessControlPolicy *AccessControlPolicy 配置该对象对于每个用户的ACL授权信息。
Bucket *string 执行本操作的桶名称。
Key *string 设置ACL信息的对象的key。
VersionId *string 设置ACL信息的对象的versionId

响应结果:

HTTP状态 响应码 描述
200 Success 操作成功。
400 InvalidBucketName 请求中设置桶的名字不合法。
400 InvalidObjectName 请求中设置对象的名字不合法
400 InvalidArgument 设置的ACL内容无效。
403 AccessDenied 用户没有权限执行操作。
404 NoSuchBucket 请求参数中设置的桶不存在。
404 NotFound 请求参数中设置的对象key或者版本Id不存在。