设置对象访问权限
PutObjectAcl操作可以为媒体存储服务中的对象设置访问权限,对一个对象执行PutObjectAcl操作需要具有WRITE_ACP权限。执行PutObjectAcl操作的时候,要么使用封装好的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 |
代码示例:
// 添加对象的访问控制项
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不存在。 |