设置桶访问权限
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不存在。 |